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.「標記清除」是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然
後再回收其內存作用域

相關文章
相關標籤/搜索