JavaScript红宝书笔记(四)---变量、做用域和内存问题

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

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

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

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

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;ip

alert(colors instanceof Array);

5.JavaScript没有块级做用域,也就是for循环、if语句等{}并不会拥有本身的做用域,因此在这些语句中定义的变量,在外部执行环境中也是能够被访问的。内存

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

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

相关文章
相关标签/搜索