js中的深拷贝和浅拷贝(js 深拷贝和浅拷贝)

js中的深拷贝和浅拷贝(js 深拷贝和浅拷贝)1 浅拷贝 Shallow Copy 浅拷贝只复制对象的第一层属性 对于原始类型 如字符串 数字 布尔值 浅拷贝会创建其副本 而对于对象或数组这样的复杂类型 浅拷贝只复制引用 而不复制其实际内容 这意味着被拷贝对象的子对象或数组仍然和原对象共享同一个引用

大家好,我是讯享网,很高兴认识大家。



1.浅拷贝(Shallow Copy):浅拷贝只复制对象的第一层属性。对于原始类型(如字符串、数字、布尔值),浅拷贝会创建其副本,而对于对象或数组这样的复杂类型,浅拷贝只复制引用,而不复制其实际内容。这意味着被拷贝对象的子对象或数组仍然和原对象共享同一个引用。

简单点来说就是:基于原对象,拷贝得到一个新的对象,原对象中内容的修改会影响新对象

2.深拷贝(Deep Copy):深拷贝会递归地复制对象及其所有子对象,从而创建一个与原对象完全独立的副本。对于复杂的数据结构,深拷贝会确保新对象与原对象之间没有任何引用关系。因此,修改深拷贝后的对象不会影响原对象。

简单点来说:基于原对象,拷贝得到一个新的对象,原对象中内容的修改不会影响新对象

直接上最容易理解的代码

1.Object.create(obj)

其中:修改中的值originalObj 的值也发生改变。

 

讯享网

注意:虽然 并不直接用于浅拷贝,但通过共享引用的特性,我们可以看到修改对象中的引用类型(如嵌套对象)会导致原型对象也被影响,从而体现出类似浅拷贝的行为。

2.Object.assign({}, obj)

的浅拷贝特性表现在:如果对象内部包含嵌套的引用类型(如对象或数组),这些嵌套对象只是复制了引用地址,而不会创建独立的副本。因此,修改浅拷贝中的嵌套对象属性时,原对象也会随之改变。

讯享网

3.[ ].concat(arr) 

是一种实现浅拷贝的方法,通常用于复制数组。它会创建一个新数组,并将原数组的第一层元素复制到新数组中。如果原数组中包含引用类型(如对象或子数组),则这些引用类型元素的引用地址会被复制,而不会复制它们的实际内容。

 

4.[…arr]展开运算符实现

它只复制原数组中的第一层元素,对于原始类型(如数字、字符串)会创建一个新的副本,但对于引用类型(如对象、子数组),只复制引用地址,不复制内容。

讯享网

5.arr.slice()

原理同上


讯享网

 

6.arr.reverse().reverse()

实际上是对原数组进行了两次反转操作,结果是将数组的顺序恢复到最初的顺序。

讯享网

1.JSON.parse(JSON.stringify(obj))

 

结论: 是一种常用的深拷贝方法。它通过将对象转换为 JSON 字符串,然后再解析回 JavaScript 对象,从而创建一个完全独立的对象副本。与浅拷贝方法不同,它可以深度复制嵌套的引用类型数据(如对象或数组),从而确保修改副本时不会影响原始对象。

2.递归拷贝(手动实现)

讯享网

3.(现代 API)

JS官方推出的一种深拷贝方法

 

优点:

  • 原生支持,性能较好。
  • 支持大多数数据类型,包括循环引用。

缺点:

  • 需要现代浏览器(支持性不够广泛)。
  • 某些老旧浏览器可能不支持。

总结一下就是:

浅拷贝方法:

深拷贝方法:

希望大家能通过本文对深浅拷贝有进一步的学习和认知。 欢迎多多评论和指导

小讯
上一篇 2025-05-23 15:24
下一篇 2025-05-25 11:33

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/197655.html