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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章