By ref or by value
基本型別
傳值
let a = 1 > let b =a 時,電腦會在記憶體中新增一個新值,讓後來的變數指向新的值
let a = 1
let b = a
b++
console.log('',a,b)
// 1 , 2 > 基本型別傳值物件型別
傳址
變數指向電腦記憶體中的相同的位址
let obj1 = { v1 : 1}
let obj2 = { v2 : 1}
console.log(obj1 == obj2) // false
console.log(obj1 === obj2) // false
// 因為是兩個獨立存在的實體
let obj3 = obj1
obj3.value = 2
console.log(obj1) //{ v1: 1, value: 2 }
console.log(obj3) //{ v1: 1, value: 2 }
console.log(obj1 == obj3) // true
console.log(obj1 === obj3) // true
obj1 = {}
console.log(obj1) // 又重新分配給 obj1 一個新的位置 > {}
console.log(obj3) // 但是obj3 沒有接到通知,所以還是{ v1: 1, value: 2 }物件型別之淺拷貝(Shallow Copy)
現在產生一個問題為,那個想要複製物件給物件怎麼辦?用等於就變成一次動到位置內的物件,故要使用淺拷貝
物件的淺拷貝
object.assign(target,sources)
物件的淺拷貝
在一個空物件中,使用
...展開運算子 展開物件
陣列型別的淺拷貝
slice():使用 slice(0),達到拷貝效果concat()forEach + push()map()filter()...展開運算子
但今天若是陣列內有物件 or 物件內有物件,則要使用深拷貝
解決方案
JSON.parse(JSON.stringify(obj1))
Last updated
Was this helpful?