首先MDN官網中有一句寫道:

assign()語法:
Object.assign(target, ...sources)
target:目標物件,接收源物件屬性的物件,也是修改后的回傳值,
sources:源物件,包含將被合并的屬性,
下面來看例子:
let s = { a: 1 }
let target = Object.assign({}, s)
console.log(target) // { a: 1 }
s.a = 2
console.log(s) // { a: 2 }
console.log(target) // { a: 1 }
看到這里可能有人會說,這不是第一層就是深拷貝嗎?其實非如此
let s = { a: { b: 1 }, c: 1 }
let target = Object.assign({}, s)
console.log(target) // { a: { b: 1 }, c: 1 }
s.a.b = 2
s.c = 3
console.log(s) // { a: { b: 2 }, c: 3 }
console.log(target) // { a: { b: 2 }, c: 1 }
target.a.b的值隨著source變化而變化,但是target.c的值并沒有隨著source變化
下面來總結開篇提到的:針對使用深拷貝,需要使用其他方法,因為
Object.assign()拷貝的是屬性值,如果源物件的屬性值是一個指向物件的指標,那也只拷貝那個指標,
所以如果物件的屬性值為基礎型別,通過Object.assign()拷貝的那個屬性而言是深拷貝,
如果物件的屬性值為參考型別,通過Object.assign()拷貝的那個屬性而言是淺拷貝,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/502737.html
標籤:JavaScript
