Js 宣告變數時都會為變數開一份記憶體位置,去存放值:
傳遞基本資料型別是 call by value,傳值時會複製一份過去,彼此修改互不影響。
但在傳遞物件型別 EX: object, array, function 時,則看起來很像 call by reference ,但其實不然,
看看以下例子:
var o1 = {
name: 'Joe'
}
var o2 = o1;
o2.age = 10; /* 此時因為與 o1 都指向同一份 ref,所以兩邊修改都是改到同一份資料,再看看下面 */
o1 = 0;
/*這時 o1 已被修改成 1,剛剛說傳物件傳的是 ref,所以如果直接覆寫這個物件,照理來講應該 o1 & o 都
應該,變成 1 才合理,結果是完全沒改變,因為 js 在傳遞物件時的機制是 call by share
*/
console.log(o2);
// log
/*
{
name: 'Joe',
}
*/
剛剛一開始說了 js 會在宣告變數時為他開一份記憶體位置,經由 call by value 時是複製一份值進去。
經由 call by share 時,其實是“複製”參考進去,所以在 function 當中覆寫,傳進來的變數,原本的物件,也不會被修改。
像剛剛例子 o1 又覆寫了,但 o2 依舊是原本的物件,經過剛剛 call by share 的推倒,可以得知 o1 只是把它 memory 裡的空間,換成了 0 ,並沒有直接改到原本物件的 memory 位置。