手寫深拷貝1
function deedCopy(val) {
let newVal = val.constructor === Array ? [] : {}
for (var key in val) {
// hasOwnProperty-檢測屬性是否為對象的自有屬性
if (val.hasOwnProperty(key)) {
if (val[key] && typeof val[key] === "object") {
newVal[key] = deedCopy(val[key])
}else {
newVal[key] = val[key]
}
}
}
return newVal
}
手寫深拷貝2
注: JSON.parse() 和 JSON.stringify()方法實現(xiàn)深拷貝時
對象里的 function 和 undefined 方法會被剔除, Map和Set會被轉(zhuǎn)換成空對象。數(shù)組里的
function 和 undefined 會被替換成null,
function deedCopy2(val) {
let newVal = JSON.parse(JSON.stringify(val))
return newVal
}
let obj2 = {
a: undefined,
b: {
aa: 2,
bb: {
aaa: 3
}
},
c: [[1], [2], [null, undefined, ()=> {}, 0]],
d: new Date(),
e: new Map(),
f: new Set(),
g: function () {
},
h: undefined
}
let newObj = deedCopy2(obj2)
console.log(obj2, newObj)
/**
newObj = {
"b": {
"aa": 2,
"bb": { "aaa": 3}
},
"c": [[1], [2], [null, null, null, 0]],
"d": "2022-12-11T11:23:36.367Z",
"e": {}
}
*