iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Modern Web

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

[Day15] 傳值或傳址(下)

承上篇

基本型別(primitive):資料以純值的形式存在。
物件型別(object):可能由零或多種不同型別(含純值與物件)所組成的物件。--008

// 比較物件型別
var obj1 = { value: 10 };
var obj2 = { value: 10 };
console.log(obj1 === obj2); // false

因兩個物件各別宣告,型別的記憶體位置不同,所以是 false 的結果。

變數的更新與傳遞(物件型別)

舉例如下,在物件型別中複製變數,複製的是他的位址,也就是所謂的傳址

let obj1 = { value: 10 };
let obj2 = obj1;
console.log(obj1 === obj2); // true

這部分與基本型別不一樣,為什麼是 true?我們畫來瞧瞧,實際上 obj2 複製了 obj1 的值,而這個值是 Heap 的位址,再來才是他的值。

那如果修改他的值會有什麼結果呢?

obj1.value = 30;

console.log(obj1); // 30
console.log(obj2); // 30

猜到了嗎?因為指向同一個 Heap,所以修改 obj1.value 後,obj1 跟 obj2 的結果也同時被影響。

參考資料

JavaScript’s Memory Model
008天重新認識JavaScript


上一篇
[Day14] 傳值或傳址(上)
下一篇
[Day16] 傳值、傳址 or call by sharing
系列文
從零開始的JS學習之路30

尚未有邦友留言

立即登入留言