《JavaScript高级程序设计》读书笔记
原始值与引用值
- 原始值:简单的数据(按值访问)
- 引用值:多个值构成的对象(按引用访问)
动态属性
- 引用值可以随时添加、修改删除其属性和方法。
- 原始值则不行,即使尝试添加属性不会报错,但是不生效。
复制值
- 原始值赋值给另一个变量时,该值是完全独立的,是那个值的副本。
- 引用值是一个指针,指向存储在堆内存中的对象,因此一个对象上的变化会在另一个对象反映出来。
传参参数
函数的参数都是按值传递的。函数外的值会被复制到函数内部的参数中,就像一个变量复制到另一个变量,和上述复制值规则一样。
确定类型
- typeof:检测原始值
- instanceof:检测引用值
执行上下文与作用域
变量或函数的上下文决定了它们可以访问哪些数据,以及它们行为。每个上下文都以一个关联的变量对象,这个上下文中定义的所有变量和函数都存在与这个对象上。全局上下文是window对象。上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数(全局上下文在应用程序退出前才会被销毁,比如关闭网页或退出浏览器)。
上下文在代码执行的时候,会创建变量对象的一个作用域链。这个链决定了各级上下文中代码在访问变量和函数的顺序,从最前端开始,逐级往后,直到找到标识符。
垃圾回收
- 标记清理:离开作用域的值自动标记为可回收,在垃圾回收被删除
- 引用计数:记录值被引用多少次
内存管理
在保证执行代码时只保存必要的数据,如果数据不在必要就设置为null,从而释放引用。这也可以叫解除引用。最使用全局变量和全局对象属性。局部变量在超出作用域后会被自动解除引用。
- 通过const 和 let 声明提升性能
- 隐藏类和删除操作。如果两个实例共享同一个构造函数和原型,V8会在后台配置,让这两个类实例共享相同的隐藏类,提升性能。如果在生成的实例后 添加属性或者delete属性,则会对应两个不同的隐藏类,可以采用 “先创建再补充” 式的动态属性赋值 和 将属性设置为null 方式优化。
内存泄漏
- 函数中变量没有加var、let 或 const 这种关键字声明,这会把变量当做window 属性创建。
- 闭包