浅拷贝
复制一层对象的属性,并不包括对象里面的为引用类型的数据,当改变拷贝的对象里面的引用类型时,源对象也会改变
使用 Object.assign实现
let obj = {
a: 1,
b: {
c: 2
}
}
let obj1 = Object.assign({}, obj);
obj.a = 3;
obj.b.c = 4;
console.log(obj1.a) // 1
console.log(obj1.b.c) // 4
使用展开运算符...
来实现
let obj = {
a: 1,
b: {
c: 2
}
}
let obj1 = {...obj};
obj.a = 3;
obj.b.c = 4;
console.log(obj1.a) // 1
console.log(obj1.b.c) // 4
深拷贝
重新开辟一个内存空间,需要递归拷贝对象里的引用,直到子属性都为基本类型。两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。
简单的做法:JSON.parse(JSON.stringfy(obj)) 但是该方法也是有局限性的:
- 会忽略undefined
- 会忽略symbol
- 会忽略函数
- 不能解决循环引用的对象 (会报错)
//使用递归的方式实现数组、对象的深拷贝
function deepClone1(obj) {
//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
//进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone1(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}