深拷贝:可以简单理解为修改拷贝出来的的对象不影响原对象
JSON.parse()和JSON.stringify()
const obj = {a:1,b:2,c:{c1:3}};
const newObj = JSON.parse(JSON.stringify(obj));
newObj.a=100
newObj.d=100
newObj.c.c1=100
newObj.c.d1=100
console.log(newObj, obj);``
- 递归函数
function deepCopy(obj) {
//判断对象的类型
var newObj = Array.isArray(obj) ? [] : {};
if (obj && typeof obj == "object") { //迭代
for (var key in obj) {
if (typeof obj[key] == 'object') {
newObj[key] = deepCopy(obj[key])
} else {
newObj[key] = obj[key]
}
}
}
return newObj
}
浅拷贝:仅仅拷贝了对象的引用。修改拷贝出来的的对象仍然会影响原对象
Object.assign()注意这个方法只能将第一层对象进行深拷贝,一旦对象中的值还存在引用数据类型就不是深拷贝了。因此不能属于深拷贝。
const obj = {a:1,b:2,c:{c1:3}};
const newObj = Object.assign({},obj)
newObj.a=100
newObj.d=100
newObj.c.c1=100
newObj.c.d1=100
console.log(newObj, obj);
查看下来newObj为{a:100,b:2,c:{c1:100,d1:100},d:100};
obj为{a:1,b:2,c:{c1:100,d1:100}}
- 结构赋值。同上
const obj = {a:1,b:2,c:{c1:3}};
const newObj = {...obj}
newObj.a=100
newObj.d=100
newObj.c.c1=100
newObj.c.d1=100
console.log(newObj, obj);