JS2-变量、作用和内存问题

基本类型和引用类型的值

引用类型可以为其添加动态的属性和方法。

检测类型 instanceof

  1. 在检测引用类型的值时,typeOf用处不大
  2. 如果想知道它是什么类型的对象: instanceof
  3. 基本类型不是对象
  4. 所有引用类型的值都是Object的实例
  5. 对正则表达式应用typeof的时候,不同的浏览器返回的不一样,chrome 7 返回function,IE和firefox返回object

执行环境和作用域

  1. 每个执行环境都有与之相关的—>变量对象(variable object)。环境中定义的所有变量和函数都保存在这个对象中。
  2. 全局执行环境—->web中window对象
  3. 每个函数都有自己的执行环境—>当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。
  4. 当代码在一个环境中执行时,会创建变量对象的一个作用链(scope chain)
  5. 作用域链的作用:保证对执行环境有权访问的所有变量和函数的有序访问。
  6. 作用域链的前端:当前执行环境的代码所在环境的变量对象。下一个变量对象:来自包含环境,而在下一个来自下一个包含环境…一直延续到全局环境。
  7. 标示符解析是沿着作用域链一级一级搜索标示符的过程。
  8. 内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。

    延长作用域链

1.try-catch语句的catch块
2.with语句

没有块级作用域

垃圾收集

找出那些不在继续使用的变量,然后释放其占用的内存。
垃圾回收器会按照固定的时间间隔周期地执行这一操作。

标记无用变量的策略

标记清楚 (mark-and-sweep)

当进入环境时,标记为“进入环境”
当离开环境时,标记为“离开环境”

引用计数(refernce counting)

跟踪记录每个值被引用的次数
问题:循环引用

性能问题

触发垃圾收集的变量分配、字面量和数组元素的临界值被调整为动态修改。

内存管理

确保占用最少的内存可以让页面获得更好的性能
优化内存的最佳方式:为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null来释放期引用,解除引用(dereferencing)
解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

总结

  1. 基本数据类型在内存中占据固定大小的空间,因此被保存在栈内存中
  2. 引用类型的值是对象,保存在堆内存中
  3. 从一个变量想另一个变量复制引用类型的值,会创建这个值的一个副本
  4. 从一个变量想另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终指向同一个对象。
  5. 包含引用类型的值的变量实际上并不是对象本身,而是一个指向对象的指针。
文章目录
  1. 1. 基本类型和引用类型的值
    1. 1.1. 引用类型可以为其添加动态的属性和方法。
  2. 2. 检测类型 instanceof
  3. 3. 执行环境和作用域
    1. 3.1. 延长作用域链
    2. 3.2. 没有块级作用域
  4. 4. 垃圾收集
    1. 4.1. 标记无用变量的策略
      1. 4.1.1. 标记清楚 (mark-and-sweep)
      2. 4.1.2. 引用计数(refernce counting)
    2. 4.2. 性能问题
    3. 4.3. 内存管理
  • 总结
  • ,