前面兩篇所講的,基本型別是傳值,物件型別是傳址,但同時也存在例外,舉下例,如果對 obj 賦予一個新的物件,那外面的變數會被改變嗎?
var coin1 = { value: 10 };
function changValue(obj) {
obj = { value: 200 };
}
changValue(coin1);
console.log(coin1); // { value: 10 } 一樣,沒有被改變
而如果不是重新賦值的狀況,而是修改屬性:
var coin1 = { value: 10 };
function changValue(obj) {
obj.value = 200
}
changValue(coin1);
console.log(coin1); // { value: 200} 外面 coin1 的值被改變了
因為寫了這個主題才發現,前面講的傳值 call by value、傳址 call by reference,還有另外一種很多人偏向的 call by sharing(未有合適翻譯),原來這是連 ECMAScript 都沒有定義的概念,於是大家都是用其他程式語言的定義來推測 JavaScript 是屬於哪一種形式。
因為無法證明 JavaScript 記憶體的運作方式,以及在不同執行引擎下會有不同結果,所以相關概念在未經證實的情況都僅能參考,而我覺得試著畫記憶體圖、流程圖的部分,能幫助自己在實作上的理解。
JavaScript’s Memory Model
008天重新認識JavaScript
Call by Reference 還是 Call by Sharing