变量、作用域与内存

《JavaScript高级程序设计》读书笔记

原始值与引用值

  • 原始值:简单的数据(按值访问)
  • 引用值:多个值构成的对象(按引用访问)

动态属性

  • 引用值可以随时添加、修改删除其属性和方法。
  • 原始值则不行,即使尝试添加属性不会报错,但是不生效。

复制值

  • 原始值赋值给另一个变量时,该值是完全独立的,是那个值的副本。
  • 引用值是一个指针,指向存储在堆内存中的对象,因此一个对象上的变化会在另一个对象反映出来。

传参参数

函数的参数都是按值传递的。函数外的值会被复制到函数内部的参数中,就像一个变量复制到另一个变量,和上述复制值规则一样。

确定类型

  • typeof:检测原始值
  • instanceof:检测引用值

执行上下文与作用域

变量或函数的上下文决定了它们可以访问哪些数据,以及它们行为。每个上下文都以一个关联的变量对象,这个上下文中定义的所有变量和函数都存在与这个对象上。全局上下文是window对象。上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数(全局上下文在应用程序退出前才会被销毁,比如关闭网页或退出浏览器)。

上下文在代码执行的时候,会创建变量对象的一个作用域链。这个链决定了各级上下文中代码在访问变量和函数的顺序,从最前端开始,逐级往后,直到找到标识符。

垃圾回收

  • 标记清理:离开作用域的值自动标记为可回收,在垃圾回收被删除
  • 引用计数:记录值被引用多少次

内存管理

在保证执行代码时只保存必要的数据,如果数据不在必要就设置为null,从而释放引用。这也可以叫解除引用。最使用全局变量和全局对象属性。局部变量在超出作用域后会被自动解除引用。

  • 通过const 和 let 声明提升性能
  • 隐藏类和删除操作。如果两个实例共享同一个构造函数和原型,V8会在后台配置,让这两个类实例共享相同的隐藏类,提升性能。如果在生成的实例后 添加属性或者delete属性,则会对应两个不同的隐藏类,可以采用 “先创建再补充”  式的动态属性赋值 和 将属性设置为null 方式优化。

内存泄漏

  • 函数中变量没有加var、let 或 const 这种关键字声明,这会把变量当做window 属性创建。
  • 闭包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天巨兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值