比如说,从数据库获取到了数据,还要对数据进行处理,然后进行展示,这个过程中,是使用浅拷贝还是深拷贝,各自有什么意义
具体,从数据库取到一个数组A,对数组A中元素的某一个字段要进行处理,处理完,进行前端展示,这个过程是否要使用深拷贝,数据处理从头到尾,没有别的分支,只有一条主线
什么场景下需要使用深拷贝
比如说,从数据库获取到了数据,还要对数据进行处理,然后进行展示,这个过程中,是使用浅拷贝还是深拷贝,各自有什么意义
具体,从数据库取到一个数组A,对数组A中元素的某一个字段要进行处理,处理完,进行前端展示,这个过程是否要使用深拷贝,数据处理从头到尾,没有别的分支,只有一条主线
什么场景下需要使用深拷贝
想对某个数组或对象的值进行修改,但是又要保留原数据的值不被修改,这时候可以用深拷贝来创建一个新的数组或对象,从而达到操作(修改)新的数组或对象时,保留原数据不变。
数组的一些方法:concat(),filter(),slice(),map()不会修改原来的数组,而是返回一个新的数组就是这个道理
其实理解的什么是浅拷贝,什么是深拷贝后,自然都明白使用场景了。
理解了之后,具体如何使用,得看需求,她两特点很好区分,多理解理解,就能明白该在什么地方使用了。
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
我个人的理解:
1、深拷贝和浅拷贝的区别,简单来说,就是会不会对原来的数据造成影响。深拷贝不会,而浅拷贝会。
2、我之前遇到的一个前端场景:页面一个表单绑定了data里边的 a 对象,当我要 post 的时候,需要对 a 里边的数据进行处理。
那么此时用的应该是对 a 进行深拷贝得到一个 b 对象,再对 b 对象进行处理。
如果是浅拷贝,那么对 a 的修改,将会影响到页面表单数据的显示。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
你好!我觉得我可以来回答一下该问题。
就像你说的那样,如果数据处理只有一条主线,比如
一个数据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中的对象绝无任何瓜葛了。