JavaScript物件導向-- 繼承(Inherit) - II

現在需要討論"參數傳遞"的3種方法:

1. call by value(傳值參考): 複製內容到新的參照(記憶體)上。

2. call by reference(傳址參考): 引用參考到新的參照上。修改或賦予新值都會改變原有參照(當賦予新值會刪除原有參照並建立新參照)。

3. call by sharing(共享參考): 複製參考到新的參照上。修改會改變原有參照; 賦予新值會產生新的參照(原來的參照會被斷開但仍存在)。


JavaScript在物件上的參數傳遞採call by sharing; 在原始(primitive)型別(String、Number、Boolean、Null)上的參數傳遞採call by value --> 因無法改變記憶體大小, 所以直接在新記憶體空間新增。


以下舉例會產生call by sharing情形:

e.g.

var arr1 = [1, 2, 3];
var arr2 = arr1;

arr2.push(4);

console.log(arr1);           // [1, 2, 3, 4], 因為arr2和arr1使用同個參照, 當我修改arr2, 會使原有參照改變, 使得arr1內容改變。
console.log(arr2);          // [1, 2, 3, 4]


那麼, 如何避免call by sharing?
e.g.

var arr1 = [1, 2, 3];
var arr2 = arr1.slice(0);          // slice(0)會從頭複製出一個新陣列

arr2.push(4);

console.log(arr1);           // [1, 2, 3]
console.log(arr2);          // [1, 2, 3, 4], 透過賦予新值給arr2, 可以為arr2建立新參照, 且arr1仍指向原有的參照, 使arr1內容不被改變




留言

熱門文章