深拷贝与浅拷贝
浅拷贝
浅拷贝是指创建一个新对象,然后将现有对象的非对象属性(如基本数据类型)复制给这个新对象,而对象类型的属性则只是复制了引用,这意味着原对象和新对象仍然共享这些对象类型的属性。
实现方法
Object.assign()
let obj = {a: 1, b: {c: 2}};
let copy = Object.assign({}, obj);
扩展运算符
let obj = {a: 1, b: {c: 2}};
let copy = {...obj};
缺点
注意
如果对象中含有嵌套的对象或数组,那么浅拷贝只会复制一层,嵌套的对象或数组依然是引用关系,改变其中一个会影响另一个。
copy.a = 2;
copy.b.c = 3;
console.log(obj.a);// 输出:1
console.log(obj.b.c); // 输出: 3
深拷贝
深拷贝是递归地复制整个对象,包括所有嵌套的对象和数组,这样原对象和新对象之间不会共享任何引用,从而确保对新对象的任何修改都不会影响到原始对象
实现方法
JSON序列化与反序列化
虽然简单,但有局限性,如无法处理函数、undefined、Symbol等特殊类型的值,且不支持循环引用。
let obj = {a: 1, b: {c: 2}};
let deepCopy = JSON.parse(JSON.stringify(obj));
递归实现深拷贝
实现起来较为复杂,性能方面可能不如浅拷贝高效
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
let clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
// 示例
let obj = {a: 1, b: {c: 2}};
let deepCopy = deepClone(obj);
console.log(deepCopy); // 输出: {a: 1, b: {c: 2}}