深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中用于复制对象或数据结构的概念。
浅拷贝是指创建一个新的对象或数组,新对象的属性或元素仍然引用原始对象的值。换句话说,只复制了对象的引用,而不是复制对象本身。因此,当修改新对象的属性或元素时,原始对象也会受到影响。
深拷贝是指创建一个新的对象或数组,并完全复制原始对象的所有属性或元素,包括嵌套的对象或数组。深拷贝会递归复制所有嵌套对象的值,而不仅仅是复制引用。因此,当修改新对象的属性或元素时,原始对象不会受到影响。
下面是一个使用浅拷贝和深拷贝的示例:
// 浅拷贝示例
const obj1 = { name: "Alice", age: 25 };
const obj2 = Object.assign({}, obj1);
obj2.name = "Bob";
console.log(obj1); // { name: "Alice", age: 25 }
console.log(obj2); // { name: "Bob", age: 25 }
// 深拷贝示例
const obj3 = { name: "Alice", age: 25 };
const obj4 = JSON.parse(JSON.stringify(obj3));
obj4.name = "Bob";
console.log(obj3); // { name: "Alice", age: 25 }
console.log(obj4); // { name: "Bob", age: 25 }
在上述示例中,使用 Object.assign() 方法进行浅拷贝,将原始对象 obj1 的属性复制给新对象 obj2。修改 obj2 的属性不会影响到 obj1。
使用 JSON.stringify() 和 JSON.parse() 方法进行深拷贝,将原始对象 obj3 转换成 JSON 字符串,再将 JSON 字符串解析成新对象 obj4。修改 obj4 的属性也不会影响到 obj3。
需要注意的是,使用 JSON.stringify() 和 JSON.parse() 方法进行深拷贝有一些限制,例如无法复制函数、循环引用等。对于复杂的嵌套对象或包含函数的对象,可能需要使用第三方库或自定义方法来实现深拷贝。