详谈Javascript中的深拷贝和浅拷贝

Crq
Crq
管理员
1492
文章
0
粉丝
Linux教程评论471字数 499阅读1分39秒阅读模式
摘要数据复制是我们编程中经常会使用到的技术,对于普通数值数据来说,复制很简单,但是对于复杂类型比如对象的复制,就会有很多需要考虑的东西,比如我们经常说到的深拷贝和浅拷贝。

详谈Javascript中的深拷贝和浅拷贝-图片1

浅拷贝

复制的对象和原始对象属性相关联。事实上,如果对象的任何字段被其他对象引用,则它们共享相同的内存地址。

深拷贝

与浅拷贝不同,深拷贝复制对象的所有属性,并且为新对象分配新的内存地址,我们对新对象的操作不会影响到原对象,看起来就像是将原对象所有的东西都重新复制出来一份。

详谈Javascript中的深拷贝和浅拷贝-图片2

数据类型

JavaScript中的数据类型分为原始数据类型和复合数据类型。

详谈Javascript中的深拷贝和浅拷贝-图片3

数值,字符串,布尔值,undefined,null为原始数据类型,而数组和对象则是复合类型。

原始数据进行复制克隆的时候,永远都是新的副本,不会和原来数据进行关联,而复合数据进行浅拷贝的时候,只是分配值的引用。

创建深拷贝

对于克隆对象,如果我们想要进行深拷贝,那么我们经常使用的方法就是JSON.parse()和JSON.stringify()。

数组Map,ForEach和Slice

对于普通的一维数组,函数Map,ForEach,Slice都提供深拷贝的功能,但是对于嵌套数组,这些函数对于内部数组的处理不提供深拷贝的功能。

总结

Object.assign和Object.create都可以进行对象的复制。

使用assign方法时,我们必须确保对象至少复制第二个参数。通常你只会传递一个空对象作为第一个参数。它不提供类似于扩展运算符的完整拷贝。

使用create方法时,现有对象作为新创建对象的原型创建一个新对象。现有对象作为原型可用,从而使所有属性都可用于新对象。但就复制而言,它提供了部分深复制,如分配和扩展运算符。

在 JavaScript 中复制对象的唯一陷阱是嵌套值。

weinxin
我的微信
微信号已复制
我的微信
这是我的微信扫一扫
 
Crq
  • 本文由 Crq 发表于2021年8月5日 10:50:53
  • 转载请注明:https://www.cncrq.com/9980.html
Redis内存碎片深入分析 Linux教程

Redis内存碎片深入分析

如果发现Redis存储数据占用的内存比操作系统分配给Redis的内存小很多,但是数据无法保存,那么可能是内存碎片很多。使用info memory​命令查看内存碎片mem_fragm...
什么样的DevOps技能是团队需要的? Linux教程

什么样的DevOps技能是团队需要的?

DevOps这个词被提及的频率越来越高,越来越多的企业开始招聘具有这个头衔的工程师(DevOps),本文介绍在企业的技术团队当中,DevOps这样的一群人扮演着什么样的角色,需要什...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证