大家开发的时候,经常会为了各种目的来拷贝对象。我们都知道复制对象有浅拷贝(Shallow Copy),深拷贝(Deep Copy)两种,下面来分别说一下他们的区别,
浅拷贝(Shallow Copy)
浅拷贝,其实就是将原对象的地址赋给了这个新声明的变量,此时原变量,新变量指向同一个对象(地址),它们对这个对象的任何操作,这两个引用都会受到影响。
同时更改所指实例
有些人管这个叫引用拷贝(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进行了深拷贝,修改一个不会影响另一个
,