iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
Modern Web

從零開始的JS學習之路系列 第 16

[Day16] 傳值、傳址 or call by sharing

傳值或傳址?

前面兩篇所講的,基本型別是傳值,物件型別是傳址,但同時也存在例外,舉下例,如果對 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


上一篇
[Day15] 傳值或傳址(下)
下一篇
[Day17] 一級函式
系列文
從零開始的JS學習之路30

尚未有邦友留言

立即登入留言