浅克隆只是简单的复制对象,如果其中一个对象是引用类型,由于引用型变量保存的是一个地址,所以复制的只是一个内存地址,改变其中一个值另一个也会改变
let obj = {content:123}
let obj2 = obj
obj.content = 321
console.log(obj.content)
console.log(obj2.content)
要解决这个问题还是需要深克隆
第一种:递归
function deepclone(start, second) {
second = second || {};
for (var i in start) {
//检查当前对象是否有这个属性
if (start.hasOwnProperty(i)) {
//如果当属性为对象,还要判断其是否为数组
if (typeof start[i] === "object") {
second[i] = (Object.prototype.toString.call(start[i] === '[object Array]') ? [] : {});
//调用递归
deepclone(start[i], second[i]);
} else {
second[i] = start[i];
}
}
}
return second;
}
var obj = {
counts: [1, 2, 3],
};
var obj2 = deepclone(obj)
obj.counts[0] = 11
console.log(obj.counts)
console.log(obj2.counts)
第二种:JSON.parse 克隆
let obj2 = JSON.parse(JSON.stringify(obj))
但是JSON.parse 克隆不支持函数、引用、undefined、Date、RegExp 等