深拷贝浅拷贝的区别
在 JavaScript 中,深拷贝和浅拷贝是用来描述对象复制的两种不同方式。它们的区别主要体现在复制后的对象与原始对象之间的关联性。
浅拷贝(Shallow Copy):
浅拷贝是指创建一个新对象,并将原始对象的属性值复制到新对象中。如果属性是基本类型(如数字、字符串、布尔值等),则复制的是该属性的值。但如果属性是引用类型(如对象、数组、函数等),则复制的是对该属性引用的地址。
简而言之,浅拷贝只复制对象的第一层属性,如果原始对象的属性是对象或数组等引用类型,浅拷贝只是复制了引用,新对象与原始对象仍然共享同一份引用类型的属性。
示例代码:
javascript
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = Object.assign({}, obj1);
obj2.a = 3;
obj2.b.c = 4;
console.log(obj1); // { a: 1, b: { c: 4 } }
console.log(obj2); // { a: 3, b: { c: 4 } }
在上面的例子中,通过 Object.assign()
方法进行浅拷贝,当修改 obj2.b.c 的值时,obj1 的相应属性也被修改了,这是因为 obj1 和 obj2 共享了同一个 b 属性的引用。
深拷贝(Deep Copy):
深拷贝是指创建一个新对象,并递归地将原始对象及其所有嵌套对象的属性值复制到新对象中,新对象与原始对象完全独立,互不影响。
简而言之,深拷贝会复制对象的所有层级的属性,无论是基本类型还是引用类型,都会创建一个新的副本。
示例代码:
javascript
const obj1 = { a: 1, b: { c: 2 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.a = 3;
obj2.b.c = 4;
console.log(obj1); // { a: 1, b: { c: 2 } }
console.log(obj2); // { a: 3, b: { c: 4 } }
在上面的例子中,通过使用 JSON.parse(JSON.stringify())
进行深拷贝,obj1 和 obj2 是完全独立的,对 obj2 的修改不会影响到 obj1。
需要注意的是,深拷贝可能存在一些限制,例如无法复制函数、循环引用等特殊情况。在进行深拷贝时,需要根据具体情况选择合适的方法或使用第三方库来实现。
总结:
浅拷贝只复制对象的第一层属性,对于引用类型的属性仍然共享同一份引用。 深拷贝复制对象的所有层级的属性,创建了一个完全独立的副本,互不影响。 深拷贝可能存在一些限制,需要根据具体情况选择合适的方法或使用第三方库来实现。