什么时候使用深拷贝,什么时候使用浅拷贝

比如说,从数据库获取到了数据,还要对数据进行处理,然后进行展示,这个过程中,是使用浅拷贝还是深拷贝,各自有什么意义

具体,从数据库取到一个数组A,对数组A中元素的某一个字段要进行处理,处理完,进行前端展示,这个过程是否要使用深拷贝,数据处理从头到尾,没有别的分支,只有一条主线

什么场景下需要使用深拷贝

阅读 4.2k
4 个回答

你好!我觉得我可以来回答一下该问题。
就像你说的那样,如果数据处理只有一条主线,比如
一个数据A,通过浅拷贝的方式变成B后,如果A不在有任何用处(即:即使B中的数据修改影响了A也没有关系),那么该浅拷贝就没问题。 常见的就是数据库获取初始数据A后转变成了B,然后仅返回B给前端。
而相反,如果A还有别的用处,比如初始数据A不光用于生成B,还要生成C,而这中间B的数据改变又可能反过来影响A,就会有问题了。我们现在假设有一个List A,其元素是对象。
读取出初始数据A
-> B是A的子集
-> C是A的子集
并且B、C的两个链表集合的交集不为空(即都含有某几个相同对象)
那么无论此时对B、C中的都含有的相同对象进行操作,都会使得另外一方中的对象内容发生改变,此时就可能达不到期望值。
这个时候就必须深度拷贝一份A的副本 A1,A用于生成B,A1用于生成C,此时BC中的对象绝无任何瓜葛了。

想对某个数组或对象的值进行修改,但是又要保留原数据的值不被修改,这时候可以用深拷贝来创建一个新的数组或对象,从而达到操作(修改)新的数组或对象时,保留原数据不变。
数组的一些方法:concat(),filter(),slice(),map()不会修改原来的数组,而是返回一个新的数组就是这个道理

其实理解的什么是浅拷贝,什么是深拷贝后,自然都明白使用场景了。

  • 浅拷贝主要就是保存一份地址副本,内容并没有受到任何影响,速度快,全一致性(因为本来就是一个)。就相当于你造了个克隆人,它疼,你也得跟着疼(有好处,有坏处),但特别的好处是,它在栈中被消灭了(引用被回收),你不会被消灭,它被别人顶替了(引用被替换),你不会被顶替。比较适合处理那种有可能被替换,但自己有想持有原对象的情况(比如多线程)。
  • 深拷贝也很好理解。拷贝出来的副本除了和自己一样(通常指data)外。其余没有任何关系。你是死是活,还是如何变化,都和我没关系。这种好处就是没有任何耦合了,完全不用担心脏到其他的数据。使用场合具体看业务。比如一份数据,需要用两种方式来计算,但又会存在一些中间状态。那么就可以克隆成两份一样的不相关数据,用多线程各搞各的。

理解了之后,具体如何使用,得看需求,她两特点很好区分,多理解理解,就能明白该在什么地方使用了。

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

我个人的理解:
1、深拷贝和浅拷贝的区别,简单来说,就是会不会对原来的数据造成影响。深拷贝不会,而浅拷贝会。
2、我之前遇到的一个前端场景:页面一个表单绑定了data里边的 a 对象,当我要 post 的时候,需要对 a 里边的数据进行处理。

那么此时用的应该是对 a 进行深拷贝得到一个 b 对象,再对 b 对象进行处理。
如果是浅拷贝,那么对 a 的修改,将会影响到页面表单数据的显示。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题