掌握基本类型和引用类型的值

  1. ECMAScript的数据类型包括两种:基本数据类型和引用数据类型。
  2. 基本数据类型指的是简单的数据段,常见的基本数据类型有: number, string, boolean, null, undefined。
  3. 引用数据类型指的是由多个值构成的对象,常见的引用数据类型(即:对象类型Object type)有: Object, Array, Function, Date等。
  4. 当我们对变量赋值时,解析器首先要确认的就是这个值是基本类型值,还是引用类型值。
  5. 两种数据类型的区别点如下:
    • 声明变量时不同的内存分配。基本类型的值保存在栈内存中,引用类型的值同时保存在栈内存和堆内存中。
    • 不同的内存分配机制也带来了不同的访问机制。
    • 赋值变量时的不同。不能给基本类型的值添加属性。
    • 参数传递的不同(把实参赋值给形参的过程)。
  6. 值的比较:
    • 基本类型的比较是值的比较;
    • 引用类型的比较是引用的比较;

执行环境及作用域

  1. 执行环境介绍

    执行环境是JavaScript中最重要的一个概念。执行函数定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象(variable object)和一个作用域链(scope chain),环境中定义的所有变量和函数都保存在其变量对象中。执行环境分为两种,即:全局执行环境和函数执行环境

  2. 全局执行环境

    全局执行环境是最外围的一个执行环境,其变量对象就是全局活动对象(window activation object),全局执行环境直到应用程序退出(例如:关闭网页或浏览器)时才会被销毁。

  3. 函数执行环境

    每个函数都有自己的执行环境。当执行流进入一个函数时,函数环境就会被推入一个环境栈中。当函数执行完之后,栈将该执行环境弹出,把控制权返回给之前的执行环境。函数执行环境的变量对象是该函数的活动对象(activation object)。

  4. 作用域链

    对于每一个执行环境,都会创建一个与之关联的作用域链。每个执行环境的作用域链的前端,始终都是该执行环境的变量对象,对于全局执行环境就相当于window对象,对于函数执行环境就相当于该函数的活动对象;对于全局执行环境,已经是根部,没有后续;对于函数执行环境,其作用域链的后续就是该函数对象的[scope]属性里的作用域链。

垃圾收集

JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存。
这种垃圾收集机制的原理其实很简单:找出那些不再继续使用的变量,然后释放其占用的内存。

  1. 标记清除:

    • JavaScript中最常用的垃圾收集方式是标记清除
    • 垃圾收集器会在运行的时候给存储在内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记。
    • 在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。
    • 最后垃圾收集器完成内存清除的工作,销毁那些带标记的值并回收它们所占用的空间。
  2. 引用计数:

    • 引用计数是不太常见的垃圾收集策略。
    • 引用计数的含义是跟踪记录每个值被引用的次数。
    • 当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1,如果该值同时赋给另一个变量,则该值引用次数加1。相反,如果包含对这个值引用的变量又取了另一个值,则该值引用次数减1。
    • 当这个值引用次数变成0时就说明没有办法再访问该值了,可将其占用的内存空间回收。
    • 当垃圾收集器下次运行时,就会释放那些引用次数为0的值所占用的内存。

另外,垃圾收集处理方式除了以上两种策略,还可以进行垃圾周期处理解除引用

  • 垃圾周期处理:找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔周期性地执行这一操作。
  • 解除引用:对于全局变量,当不再使用时,使用null赋值是一个良好的习惯。