1、变量包含两种不同类型的值:基本类型值和引用类型值。基本类型值是指保存在栈内存中的简单数据段,即完全保存在内存中的一个位置。引用类型值是指保存在堆内存中的对象,即变量中保存的实际上只是一个指针,这个指针指向内存的另一个保存对象的位置。

(1)对于基本类型值的变量,是按值访问的;对于引用类型值,首先从栈中读取内存地址,找到保存在堆中的值,即按引用访问。

(2)基本类型值不能动态添加属性;引用类型值可以动态的添加属性。

(3)在复制变量值时,基本类型值是复制一个具体的值,在改变其中一个变量的时候,不会影响另一个变量;引用类型值是复制一个引用,在改变其中一个变量的时候,会影响另一个变量。

(4)检测一个变量的类型,使用 typeof 操作符和 instanceof 操作符,typeof 用于基本类型值,instanceof 用于引用类型值:variable instanceof constructor //true or false

2、执行环境和作用域

(1)执行环境(execution context)定义了变量或函数有权访问的数据,即变量对象(variable object)。执行环境包括全局执行环境和局部执行环境。

(2)当代码在执行环境中运行时,会创建由对象构成的一个作用域链(scope chain)。作用域连是保证对执行环境有权访问的所有变量和函数的有序访问。当执行环境为全局执行环境时,作用域链是当前全局的变量对象;当执行环境为局部执行环境(函数)时,作用域链的变量对象只包含一个变量,即 arguments 对象。

(3)使用 try-catch 语句的 catch 块以及 with 语句,都能延长作用域链。

(4)JavaScript 中没有块级作用域,如:

1
2
3
4
5
if (true) {
  var test = "test";

}
alert(test); //test

3、垃圾回收机制

(1)类型:主要包括标记清除(mark-and-sweep)和引用计数(reference counting)。JavaScript 使用的垃圾回收机制都是标记清楚,而 IE 中的 COM 对象使用的是引用计数。

(2)工作方式:如果垃圾收集例程回收的内存分配量低于 15%,则变量、字面量和数组元素的临界值就会加倍;如果例程回收了 85% 的内存分配量,则将各种临界值重置为默认值。

(3)解除引用:执行中的代码只保存必要的数据,一旦数据不再使用,便将其值设置为 null 来释放其引用。