首先MDN官網中有一句寫道: assign()語法: Object.assign(target, ...sources) target:目標對象,接收源對象屬性的對象,也是修改後的返回值。sources:源對象,包含將被合併的屬性。下麵來看例子: let s = { a: 1 } let targe ...
首先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()拷貝的那個屬性而言是淺拷貝。