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內容不被改變
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內容不被改變
留言
張貼留言