乐趣区

JavaScript红宝书笔记四变量作用域和内存问题

1. 在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

2. 当从一个变量向另一个变量复制引用类型的值时,两个变量实际上将引用同一个对象,因此,改变其中一个变量,就会影响另一个变量。

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"

3. 访问变量有按值和按引用两种方式,而参数只能按值传递;
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,即命名参数;
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部;

function setName(obj) {
    obj.name = "Nicholas";
    obj = new Object();
    obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"

上面实例代码,person 变量将内存地址作为值传递给 setName 参数。第一次给 obj 变量添加 name 属性是在 person 对象的内存地址基础上添加,之后重新赋新对象给 obj 变量,该对象为局部对象,内存地址与 person 对象并不相同,所以第二次添加 name 属性并不会影响 person 属性。也证明了参数传递方式为按值传递。

4. 检测基本数据类型可以使用 typeof;检测引用类型使用 instanceof;

alert(colors instanceof Array);

5.JavaScript 没有块级作用域,也就是 for 循环、if 语句等 {} 并不会拥有自己的作用域,所以在这些语句中定义的变量,在外部执行环境中也是可以被访问的。

for (var i=0; i < 10; i++){doSomething(i);
}
alert(i); //10

6.“标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然
后再回收其内存

退出移动版