手写深拷贝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()方法实现深拷贝时
对象里的 function 和 undefined 方法会被剔除, Map和Set会被转换成空对象。数组里的
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": {}
}
*