JavaScript 变量可以保存两种类型的值:原始值和引用值。原始值可能是以下 6 种原始数据类型之
一:Undefined、Null、Boolean、Number、String 和 Symbol。原始值和引用值有以下特点。
1、 原始值大小固定,因此保存在栈内存上。
2、 从一个变量到另一个变量复制原始值会创建该值的第二个副本。
3、 引用值是对象,存储在堆内存上。
4、 包含引用值的变量实际上只包含指向相应对象的一个指针,而不是对象本身。
5、 从一个变量到另一个变量复制引用值只会复制指针,因此结果是两个变量都指向同一个对象。
6、 typeof 操作符可以确定值的原始类型,而 instanceof 操作符用于确保值的引用类型。
任何变量(不管包含的是原始值还是引用值)都存在于某个执行上下文中(也称为作用域)。这个 上下文(作用域)决定了变量的生命周期,以及它们可以访问代码的哪些部分。执行上下文可以总结 如下。
1、 执行上下文分全局上下文、函数上下文和块级上下文。
2、 代码执行流每进入一个新上下文,都会创建一个作用域链,用于搜索变量和函数。
3、 函数或块的局部上下文不仅可以访问自己作用域内的变量,而且也可以访问任何包含上下文乃 至全局上下文中的变量。
4、 全局上下文只能访问全局上下文中的变量和函数,不能直接访问局部上下文中的任何数据。
5、 变量的执行上下文用于确定什么时候释放内存。
JavaScript 是使用垃圾回收的编程语言,开发者不需要操心内存分配和回收。JavaScript 的垃圾回收 程序可以总结如下。
1、 离开作用域的值会被自动标记为可回收,然后在垃圾回收期间被删除。
2、 主流的垃圾回收算法是标记清理,即先给当前不使用的值加上标记,再回来回收它们的内存。
3、 引用计数是另一种垃圾回收策略,需要记录值被引用了多少次。JavaScript 引擎不再使用这种算 法,但某些旧版本的 IE 仍然会受这种算法的影响,原因是 JavaScript 会访问非原生 JavaScript 对 象(如 DOM 元素)。
4、 引用计数在代码中存在循环引用时会出现问题。
5、 解除变量的引用不仅可以消除循环引用,而且对垃圾回收也有帮助。为促进内存回收,全局对 象、全局对象的属性和循环引用都应该在不需要时解除引用 。