主页 > 开源代码  > 

深浅拷贝区别,怎么区别使用

深浅拷贝区别,怎么区别使用

在 JavaScript 中,深拷贝(Deep Copy) 和 浅拷贝(Shallow Copy) 是两种不同的对象复制方式,它们的区别主要体现在对嵌套对象的处理上。以下是它们的详细对比及使用场景:


1. 浅拷贝(Shallow Copy)

定义:

浅拷贝只复制对象的第一层属性,如果属性是基本类型(如 string、number、boolean),则直接复制值;如果属性是引用类型(如 object、array),则复制引用(内存地址)。

浅拷贝后的对象和原对象共享嵌套的引用类型数据。

实现方式:

使用 Object.assign():

const obj = { a: 1, b: { c: 2 } }; const shallowCopy = Object.assign({}, obj);

使用扩展运算符(...):

const obj = { a: 1, b: { c: 2 } }; const shallowCopy = { ...obj };

特点:

修改浅拷贝对象的第一层属性不会影响原对象。

修改浅拷贝对象的嵌套对象属性会影响原对象。

示例:

const obj = { a: 1, b: { c: 2 } }; const shallowCopy = { ...obj }; shallowCopy.a = 10; // 修改第一层属性 shallowCopy.b.c = 20; // 修改嵌套对象属性 console.log(obj); // { a: 1, b: { c: 20 } } (嵌套对象被修改) console.log(shallowCopy); // { a: 10, b: { c: 20 } }
2. 深拷贝(Deep Copy)

定义:

深拷贝会递归复制对象的所有层级属性,包括嵌套的引用类型数据。

深拷贝后的对象和原对象完全独立,互不影响。

实现方式:

使用 JSON.parse(JSON.stringify()):

const obj = { a: 1, b: { c: 2 } }; const deepCopy = JSON.parse(JSON.stringify(obj));

注意:这种方法无法复制函数、undefined、Symbol 等特殊类型。

使用递归函数或工具库(如 Lodash 的 _.cloneDeep):

const _ = require('lodash'); const obj = { a: 1, b: { c: 2 } }; const deepCopy = _.cloneDeep(obj);

特点:

修改深拷贝对象的任何属性都不会影响原对象。

深拷贝会完全复制对象的所有层级数据。

示例:

const obj = { a: 1, b: { c: 2 } }; const deepCopy = JSON.parse(JSON.stringify(obj)); deepCopy.a = 10; // 修改第一层属性 deepCopy.b.c = 20; // 修改嵌套对象属性 console.log(obj); // { a: 1, b: { c: 2 } } (原对象不受影响) console.log(deepCopy); // { a: 10, b: { c: 20 } }
3. 浅拷贝和深拷贝的区别 特性浅拷贝(Shallow Copy)深拷贝(Deep Copy)复制层级只复制第一层属性递归复制所有层级属性嵌套对象嵌套对象是引用(共享内存地址)嵌套对象是独立的(不共享内存地址)性能性能较高性能较低(递归复制)实现方式Object.assign()、扩展运算符JSON.parse(JSON.stringify())、递归函数、工具库适用场景对象结构简单,无需复制嵌套对象对象结构复杂,需要完全独立的对象
4. 如何选择使用浅拷贝和深拷贝

使用浅拷贝的场景:

对象结构简单,没有嵌套对象或数组。

只需要复制第一层属性,且不关心嵌套对象是否共享。

性能要求较高,且不需要完全独立的对象。

使用深拷贝的场景:

对象结构复杂,包含嵌套对象或数组。

需要完全独立的对象,修改拷贝对象不影响原对象。

不关心性能开销,且需要完整的复制。


5. 总结

浅拷贝:

只复制第一层属性,嵌套对象是引用。

适合简单对象或性能敏感的场景。

深拷贝:

递归复制所有层级属性,嵌套对象是独立的。

适合复杂对象或需要完全独立的场景。

根据实际需求选择合适的拷贝方式,可以避免不必要的性能开销和潜在的错误。

标签:

深浅拷贝区别,怎么区别使用由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“深浅拷贝区别,怎么区别使用