浅拷贝是能拷贝值类型(简单数据类型)
深拷贝,拷贝引用类型(互相不影响)
先创建一个对象obj1
let obj1 = {
name: "zhouhe",
age: 18,
friend: [
"小红",
"小李",
"小明",
{
name: "10086",
say() {
alert("你的话费余额不足");
},
},
],
};
01. 浅拷贝 for in 拷贝
let obj2 = {};
for (let k in obj1) {
obj2[k] = obj1[k];
}
02. Object.assign()
let obj2 = {};
for (let k in obj1) {
obj2[k] = obj1[k];
}
03 扩展拷贝
let obj4 = { ...obj1 };
01.深拷贝 转字符串
let str = JSON.stringify(obj1); //先转字符串
let obj5 = JSON.parse(str); //字符串转对象
这是一种方法,不过有些缺点:
值只能是 string number null undefined {} []
dom节点,方法,函数,会丢失
02. 递归
function deepCopy(obj) {
//结束条件
if (typeof obj != "object" || typeof obj == null) {
return obj;
} else {
//如果是数组
let temp;
if (obj instanceof Array) {
temp = [];
for (let i = 0; i < obj.length; i++) {
temp[i] = deepCopy(obj[i]);
}
} else {
temp = {};
for (let k in obj) {
temp[k] = deepCopy(obj[k]);
}
}
//如果是对象
return temp;
}
}
let obj6 = deepCopy(obj1);
用递归一层一层的拷贝下去,可以完美的深拷贝成功。