欢迎大家来到IT世界,在知识的湖畔探索吧!
大家开发的时候,经常会为了各种目的来拷贝对象。我们都知道复制对象有浅拷贝(Shallow Copy),深拷贝(Deep Copy)两种,下面来分别说一下他们的区别,
浅拷贝(Shallow Copy)
浅拷贝,其实就是将原对象的地址赋给了这个新声明的变量,此时原变量,新变量指向同一个对象(地址),它们对这个对象的任何操作,这两个引用都会受到影响。
同时更改所指实例
欢迎大家来到IT世界,在知识的湖畔探索吧!
有些人管这个叫引用拷贝(Ref Copy),但我觉得从概念上说它们应该是一回事。
深拷贝(Deep Copy)
深层复制方法创建一个副本,其中源和复制的变量引用完全不同。 这意味着在一个地方进行的修改只会影响我们正在进行更改的变量。
更改一个实例不会影响另外一个
关于JavaScript多说一点,省略号操作符(Spread (…) operator): 只会复制对象第一层的属性,如果嵌套一个对象,它就不会对嵌套对象进行深拷贝。
对address进行了浅拷贝,修改一个会影响另一个
我们可以用JSON.parse() and JSON.stringify()来对整个对象进行深拷贝
对address进行了深拷贝,修改一个不会影响另一个
现在就可以看到address也被复制了一分,对新对象的修改也不会影响老的。然而,这种通过转化为JSON进行的深拷贝操作是不被推荐的,如果对象中包含了日期,函数,正则表达式等字段,它们是不会被这种方式深拷贝的,容易导致程序错误。更好的方式推荐使用structuredClone()方法或者第三方库比如lodash来做深拷贝。_.cloneDeep(value)
注:structuredClone是用的时候要注意它的兼容性。大部分浏览器都支持,node.js要17+才行
使用起来倒是挺简单的,直接调用就行。可以看到下图,address也同样被进行了深拷贝。
对address进行了深拷贝,修改一个不会影响另一个
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/108965.html