物件傳址 Call by reference
1 | let obj1 = { a: 1 } |
為啥obj1 === obj2會等於false呢?
因為在JS中,每個物件都是獨立存在的個體,在比較物件型別時,比較的是記憶體位置,亦即參考(reference),而非值(value)。
物件內容比較
用JSON.stringify()
1 |
|
物件拷貝
主要分為淺拷貝、深拷貝
淺拷貝
把物件內容複製到一個空物件裡面
1
2
3
4let obj1 = { a: 1 }
let obj2 = Object.assign({}, obj)
console.log(obj2) // { a: 1 }使用
...物件展開運算子1
2
3
4let obj1 = { a: 1 }
let obj2 = { ...obj1 }
console.log(obj2) // { a: 1 }
淺拷貝缺點
1 | let obj1 = { |
可以注意到內層的物件還是指向相同記憶體位置。所以淺拷貝只有改變外層容器的地址,沒動到內層。
深拷貝
解決淺拷貝的缺點,完全複製一份
1 | let obj1 = { |
先用JSON.stringify把obj1轉成JSON string,再用JSON.parse轉成物件,就可以完成複製
深拷貝缺點
JSON.stringify會自動過濾掉key 為 symbol 或值為 undefined 的屬性
詳細的解決可參考:
https://blog.techbridge.cc/2018/06/23/javascript-call-by-value-or-reference/
參考文章