深拷贝和浅拷贝都是用来复制一个对象的内容到另一个对象中的方法。
浅拷贝会复制一个对象的引用,新对象和原对象会指向同一个内存地址。修改新对象的属性值也会影响原对象的属性值。例如:
const obj1 = {a: 1, b: {c: 2}};
const obj2 = obj1; // 浅拷贝,obj2和obj1指向同一个内存地址
obj2.a = 3;
obj2.b.c = 4;
console.log(obj1.a); // 3
console.log(obj1.b.c); // 4
而深拷贝会复制一个对象的值,新对象和原对象的值相同,但是指向不同的内存地址,修改新对象的属性值不会影响原对象的属性值。例如:
const obj1 = {a: 1, b: {c: 2}};
const obj2 = JSON.parse(JSON.stringify(obj1)); // 深拷贝,使用JSON序列化和反序列化方法
obj2.a = 3;
obj2.b.c = 4;
console.log(obj1.a); // 1
console.log(obj1.b.c); // 2
在实现一个深拷贝时,可以使用递归方法遍历对象的属性,将每个属性复制到新对象中。以下是一个简单的实现:
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) { // 非对象和null直接返回
return obj;
}
const newObj = Array.isArray(obj) ? [] : {}; // 判断是数组还是对象,创建一个新的空数组或对象
for (let key in obj) { // 遍历对象的属性
if (Object.prototype.hasOwnProperty.call(obj, key)) { // 判断是否是对象自身的属性
newObj[key] = deepCopy(obj[key]); // 递归深拷贝
}
}
return newObj;
}
const obj1 = {a: 1, b: {c: 2}};
const obj2 = deepCopy(obj1); // 深拷贝
obj2.a = 3;
obj2.b.c = 4;
console.log(obj1.a); // 1
console.log(obj1.b.c); // 2