一,用递归去复制所有层级属性
function deepClone(obj) {
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) { //判断obj的子属性是否为对象,如果是,递归复制
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else { //如果不是,简单复制
objClone[key] = obj[key];
}
// objClone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]
}
}
}
return objClone;
}
// 对象
let oldObj = {
a: 1,
b: {
c: 2,
d: 2
}
}
newObj = deepClone(oldObj);
oldObj['b'].d = 3
console.log(oldObj, newObj);
console.log(oldObj === newObj);
// 数组
let oldArr = [1, 2, 3, [4,4]]
newArr = deepClone(oldArr);
oldArr[3][1] = 5
console.log(oldArr, newArr);
console.log(oldArr === newArr);
二,用JSON对象的parse和stringify实现
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
// 对象
let oldObj = {
a: 1,
b: {
c: 2,
d: 2
}
}
newObj = deepClone(oldObj);
oldObj['b'].d = 3
console.log(oldObj, newObj);
console.log(oldObj === newObj);
// 数组
let oldArr = [1, 2, 3, [4,4]]
newArr = deepClone(oldArr);
oldArr[3][1] = 5
console.log(oldArr, newArr);
console.log(oldArr === newArr);
三,注意
(1)深拷贝,是拷贝对象各个层级的属性;
(2)concat
与slice
方法,只能拷贝第一层属性,他们都不是真正的深拷贝;