@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...