ES6 Object 物件深淺拷貝

2022-09-18 14:42:16 字數 1546 閱讀 5245

@author ixenos

object.assign(target, ...sources)
const target = ;
array.prototype.concat

array.prototype.slice

無迴圈引用

無不可列舉屬性

鍵值會消失:物件的值中為function、undefined、symbol 這幾種型別,。

鍵值變成空物件:物件的值中為map、set、regexp這幾種型別。

json.parse(json.stringify(obj))

function deepclone(obj) 

} return newobj;

}

基礎遞迴賦值存在的問題

function deepclone(target) 

function clone(data)

// 日期或者正則物件則直接構造乙個新的物件返回

if ([date, regexp].includes(data.constructor))

// 處理函式物件

if (typeof data === 'function')

// 如果該物件已存在,則直接返回該物件

const exist = map.get(data)

if (exist)

// 處理map物件

if (data instanceof map) else

})return result

}// 處理set物件

if (data instanceof set) else

})return result

}// 收集鍵名(考慮了以symbol作為key以及不可列舉的屬性)

const keys = reflect.ownkeys(data)

// 利用 object 的 getownpropertydescriptors 方法可以獲得物件的所有屬性以及對應的屬性描述

const alldesc = object.getownpropertydescriptors(data)

// 結合 object 的 create 方法建立乙個新物件,並繼承傳入原物件的原型鏈, 這裡得到的result是對data的淺拷貝

const result = object.create(object.getprototypeof(data), alldesc)

// 新物件加入到map中,進行記錄

map.set(data, result)

// object.create()是淺拷貝,所以要判斷並遞迴執行深拷貝

keys.foreach(key => else

})return result

}return clone(target)

}

參考博文

ES6 Object擴充套件 學習筆記

1 object.is 用來比較兩個值是否嚴格相等,與嚴格比較運算子 的行為基本一致。object.is foo foo true object.is false 2 object.assign 用於物件的合併,將源物件 source 的所有可列舉屬性,複製到目標物件 target object.a...

物件的深淺拷貝

import dsjcopyctrl.h inte ce dsjcopyctrl end implementation dsjcopyctrl void viewdidload void strcopy void arrcopy void diccopy 0x2810955e0 nssingleen...

物件的深淺拷貝

object.assgin 會合併乙個物件生成乙個新物件。如果物件是普通型別改變之後新物件不會改變,如果是引用型別改變後新物件也會改變,所以obeject.assgin實際上還是淺拷貝。var obj var newobj object.assgin obj obj.aa 2 obj.bb.item...