资讯专栏INFORMATION COLUMN

JS高级程序设计(4-5章)-笔记

MycLambert / 2197人阅读

摘要:写在前面本文记录的是我不熟悉或者我认为值得注意的地方,并不是书上知识点的概括第章变量作用域和内存问题对象是按引用传递的我理解的是传值其实传的是一个指针,该指针指向内存中的某个对象。

写在前面

本文记录的是我不熟悉或者我认为值得注意的地方,并不是书上知识点的概括

第4章 变量、作用域和内存问题

对象是按引用传递的(我理解的是传值其实传的是一个指针,该指针指向内存中的某个对象)。举例如下:

const a = {name: "aaa"}
const b = a // 这时候a和b其实指向的是同一个对象
console.log(b.name)  // aaa
b.name = "bbb"
console.log(b.name)  // bbb
console.log(a.name)  // bbb 在改变b时a也被改变了

对于简单的对象(属性的值都为基本数据类型),赋值时采用const b = {...a}或者const b = Object.assign({}, a)可以使得b中的对象是一个新对象

Lodash提供了cloneDeep()函数用于深拷贝

对象按引用传递是因为这样比较节约内存(毕竟多个对象其实只存了一份嘛),弊端就是容易引起不被希望的变化。

JS具有自动垃圾回收机制,开发人员不用关心内存使用问题,其原理是找出不再继续使用的变量,释放其占用的内存

最常用的回收方式是标记清除,另一个不太常见的是引用计数

引用计数中,无法处理循环引用(对象a中包含指向b的指针,对象b中也包含指向a的指针),举例如下

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
}

可以通过在函数结尾断开引用来解决循环引用的问题,如下

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
    // 别的啥啥操作
    
    // 设为null即可
    a.obj = null
    b.obj = null
}

优化内存占用:无用的数据将其值设为null

第5章 引用类型

引用类型的值(对象)是引用类型的一个实例

新对象是new操作符后面跟一个构造函数来创建的

数组的sort()方法默认是按从小到大排序,会根据每一项的toString()方法得到的字符串进行排序。由于是比较的是字符串,在大多数情况下,排序结果不是我们期望的(比如"10"<"5"),我们需要自己去写一个排序函数传给sort()

数组的concat()可以接受多个参数,如下

const a = [1, 2]
const b = a.concat(3, [4, 5])
console.log(b) // [1, 2, 3, 4, 5]

数组的splice()用于在数组中插入一个或者多个值,如下

const a = [1, 4, 5]
a.splice(1, 0, 2, 3) // 接收的参数依次为 index,要删除的元素个数,要插入的元素们
console.log(a) // [1, 2, 3, 4, 5]

所以数组的splice()也可用于替换数组中的某些项,如下

const a = [1, 2, 3, 4, 5]
a.splice(1, 2, 22, 33)
console.log(a) // [1, 22, 33, 4, 5]

由于函数也是对象,所以函数名其实是一个指向函数对象的指针

定义一个函数可以用函数声明 function funcName() {}或者函数表达式 const func = function() {}, 建议用函数表达式定义函数,好处是定义之后不可被修改,也不会存在函数声明提升

函数内部有两个特殊对象,argumentsthisarguments是一个类数组对象,包含着所有传入函数中的参数,this指向的是函数执行的环境对象

字符串的toLocaleLowerCase()是针对地区作了特殊处理的(不同地区对于某些值的转换规则会有些不一样),相对于toLowerCase()来说更安全

完。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89134.html

相关文章

  • JS高级程序设计(1-3)-笔记

    摘要:写在前面本文记录的是我不熟悉或者我认为值得注意的地方,并不是书上知识点的概括。再就是画图这种。与浏览器没有依赖关系。 写在前面 本文记录的是我不熟悉或者我认为值得注意的地方,并不是书上知识点的概括。 第1章 JavaScript简介 JS诞生时间:1995年(好年轻...) JS诞生背景:表单数据合法性由服务端验证的用户体验不好,希望能在客户端进行验证 JS现在用处:如果没有...

    Cristic 评论0 收藏0
  • 《JavaScript高级程序设计》(第3版)读书笔记 第1~2

    摘要:表示应该立即下载脚本,但不应妨碍页面中的其他操作可选。表示通过属性指定的代码的字符集。表示脚本可以延迟到文档完全被解析和显示之后再执行。实际上,服务器在传送文件时使用的类型通常是,但在中设置这个值却可能导致脚本被忽略。 第1章 JavaScript 简介 虽然JavaScript和ECMAScript通常被人们用来表达相同的含义,但JavaScript的含义比ECMA-262要多得多...

    Corwien 评论0 收藏0
  • <javascript高级程序设计>第十二读书笔记----偏移量

    摘要:包括元素的高度上下内边距上下边框值,如果元素的的值为那么该值为。该值为元素的包含元素。最后,所有这些偏移量都是只读的,而且每次访问他们都需要重新计算。为了避免重复计算,可以将计算的值保存起来,以提高性能。 offsetHeight 包括元素的高度、上下内边距、上下边框值,如果元素的style.display的值为none,那么该值为0。offsetWidth 包括元素的宽度、左...

    dayday_up 评论0 收藏0
  • Ajax与Comet-JavaScript高级程序设计第21读书笔记(1)

    摘要:技术的核心是对象即。收到响应后,响应的数据会自动填充对象的属性,相关的属性有作为响应主体被返回的文本。收到响应后,一般来说,会先判断是否为,这是此次请求成功的标志。中的版本会将设置为,而中原生的则会将规范化为。会在取得时报告的值为。 Ajax(Asynchronous Javascript + XML)技术的核心是XMLHttpRequest对象,即: XHR。虽然名字中包含XML,但...

    imingyu 评论0 收藏0
  • ApacheCN 人工智能知识树 v1.0

    摘要:贡献者飞龙版本最近总是有人问我,把这些资料看完一遍要用多长时间,如果你一本书一本书看的话,的确要用很长时间。为了方便大家,我就把每本书的章节拆开,再按照知识点合并,手动整理了这个知识树。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 贡献者:飞龙版...

    刘厚水 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<