使用 Object.assign() 用於複製時要注意的事
前言
在之前的 在 JavaScript 裡複製物件的新選項 提到 Object.assign() 的使用,但實際使用時發現有淺層與深層複製的問題,在此把學習的過程做個紀錄。
內容
範例如下
let obj = {
a : {
b : 4
},
c : 1234
}
let dstObj = Object.assign( {} , obj );
let dstObj1 = JSON.parse( JSON.stringify( obj ) );
//
obj.c =5678;
console.log( dstObj.c );//1234
console.log( dstObj1.c );//1234
//
obj.a.b = 5;
console.log( dstObj.a.b );//5
console.log( dstObj1.a.b );//4
透過 Object.assign() 複製物件是一種淺層複製,也就是範例的 dstObj ,要深層複製的話就要透過 JSON 來複製,也就是範例的 dstObj1 ,淺層複製在複製 Number 或 String 時沒什麼問題,無論 obj.c 如何更改,dstObj 與 dstObj1 都不會更改,但如果複製 Object 的話就會有麻煩,淺層複製 Object 時,只會複製它的參照,並不會複製 Object 的內容,所以當 obj.a.b 更改時,dstIbj.a.b 也跟著更改了,因為根本是同一物件,但透過深層複製的 dstObj1 就沒這個問題。
參考資料
[ developer.mozilla.org ] Object.assign()
沒有留言:
張貼留言