javascript 浅拷贝和深拷贝(JavaScript-浅拷贝)

大家开发的时候,经常会为了各种目的来拷贝对象。我们都知道复制对象有浅拷贝(Shallow Copy)深拷贝(Deep Copy)两种,下面来分别说一下他们的区别,

浅拷贝(Shallow Copy)

浅拷贝,其实就是将原对象的地址赋给了这个新声明的变量,此时原变量,新变量指向同一个对象(地址),它们对这个对象的任何操作,这两个引用都会受到影响。

javascript 浅拷贝和深拷贝(JavaScript-浅拷贝)(1)

同时更改所指实例

有些人管这个叫引用拷贝(Ref Copy),但我觉得从概念上说它们应该是一回事。

深拷贝(Deep Copy)

深层复制方法创建一个副本,其中源和复制的变量引用完全不同。 这意味着在一个地方进行的修改只会影响我们正在进行更改的变量。

javascript 浅拷贝和深拷贝(JavaScript-浅拷贝)(2)

更改一个实例不会影响另外一个

关于JavaScript多说一点,省略号操作符(Spread (...) operator): 只会复制对象第一层的属性,如果嵌套一个对象,它就不会对嵌套对象进行深拷贝。

javascript 浅拷贝和深拷贝(JavaScript-浅拷贝)(3)

对address进行了浅拷贝,修改一个会影响另一个

我们可以用JSON.parse() and JSON.stringify()来对整个对象进行深拷贝

javascript 浅拷贝和深拷贝(JavaScript-浅拷贝)(4)

对address进行了深拷贝,修改一个不会影响另一个

现在就可以看到address也被复制了一分,对新对象的修改也不会影响老的。然而,这种通过转化为JSON进行的深拷贝操作是不被推荐的,如果对象中包含了日期,函数,正则表达式等字段,它们是不会被这种方式深拷贝的,容易导致程序错误。更好的方式推荐使用structuredClone()方法或者第三方库比如lodash来做深拷贝。_.cloneDeep(value)

注:structuredClone是用的时候要注意它的兼容性。大部分浏览器都支持,node.js要17 才行

javascript 浅拷贝和深拷贝(JavaScript-浅拷贝)(5)

使用起来倒是挺简单的,直接调用就行。可以看到下图,address也同样被进行了深拷贝。

javascript 浅拷贝和深拷贝(JavaScript-浅拷贝)(6)

对address进行了深拷贝,修改一个不会影响另一个

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页