变量、作用域和内存问题
重点:
1、理解基本类型和引用类型的值
2、理解执行环境
3、理解垃圾收集
一、基本类型和引用类型的值
ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值。
基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。
基本数据类型包括:Undefined、Null、Boolean、Number和String。这5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。
引用类型的值是保存在内存中的对象。JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。
检测一个变量是不是基本数据类型使用typeof操作符。
1 var s = "string"; 2 var b = true; 3 var i = 22; 4 var u; 5 var n = null; 6 var o = new Object(); 7 8 alert(typeof s); // string 9 alert(typeof b); // boolean 10 alert(typeof i); // number 11 alert(typeof u); // undefined 12 alert(typeof n); // null 13 alert(typeof o); // object
检测引用类型的值时,使用instanceof操作符
1 alert(person instanceof Object); // 变量person是Object吗? 2 alert(colors instanceof Array); // 变量colors是Array吗? 3 alert(pattern instanceof RegExp); // 变量pattern是RegExp吗?
基本类型值和引用类型值具有以下特点:
a、基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
b、从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
c、引用类型的值是对象,保存在堆内存中;
d、包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
e、从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
f、确定一个值是哪种基本类型可以使用 typeof 操作符,而确定一个值是哪种引用类型可以使用 instanceof 操作符。
二、执行环境及作用域
执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的一个执行环境。在Web浏览器中,全局执行环境被认为是 window 对象。因此所有的全局变量和函数都是做为 window 对象的属性和方法创建的。
内部环境可以通过作用域链访问外部环境,反之,则不行;每个环境可以向上搜索作用域链来查询变量和函数名,但不能向下搜索而进入另一个执行环境。
作用域链的用途:保证对执行环境有权访问的所有变量和函数的有序访问。
JavaScript没有块级作用域,因此,if、for语句中的变量声明会将变量添加到当前的执行环境中。
三、垃圾收集
离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。
“标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存。
另一种垃圾收集算法是“引用计数”,当代码中存在循环引用现象时,“引用计数”算法就会导致问题。
一旦数据不再有用,最好通过将其值设置为 null 来解释其引用,这种做法叫解除引用。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

浙公网安备 33010602011771号