TsaiChihWei / learning-blog

1 stars 0 forks source link

[筆記]從 Object 的等號真正的理解變數儲存模型 #4

Open TsaiChihWei opened 4 years ago

TsaiChihWei commented 4 years ago

從 Object 的等號真正的理解變數儲存模型

此篇章為上完 JavaScript 全攻略:克服 JS 的奇怪部分 和看完 從博物館寄物櫃理解變數儲存模型 後經過個人領悟所整理的筆記,若有謬誤請不吝告知,非常感謝!

當你想存取的變數是「純值」 Primitive values (數字、字串等等)的時候,變數裡面存的內容就真的是那個值。 但如果你想存物件的時候,變數裡面存的內容其實是記憶體位址。

let a = [1, 2, 3]
let b = [1, 2, 3]
console.log(a === b)  // false

let c = 123
let d = 123
console.log(c === d)  // true

let obj1 = {a: 1}
let obj2 = {a: 1}
console.log(obj1 === obj2)  // false

a 跟 b 看起來長的一樣卻不相等是因為變數存取物件(包含函數和陣列)內容的方式是存取記憶體位置,a 與 b 指向不同記憶體位置,所以不相等,obj1 和 obj2 同理。然而,c 和 d 存取的內容是純值(這邊是數值),內容就是值本身,所以 c === d 的結果為 true,儘管它們的的記憶體位址不同。

TsaiChihWei commented 4 years ago

新增延伸題:

深入探討 JavaScript 中的參數傳遞:call by value 還是 reference?

結論:

  1. JavaScript 裡面只有 pass by value
  2. JavaScript 的 primitive type 是 pass by value,object 是 pass by sharing