假设想要得到两个一样的对象,我们会想到
let obj2=obj1
但这样我们会发现,在更改obj2的时候,obj1也被改变,这是因为对象是引用类型,那如何得到两个不相互影响,且初始值相同的对象?
在js中可以使用ES6的拓展运算符...来拷贝obj2,第一层可以正常修改,但遇到多层嵌套时,就会出现内层改变值会影响obj1
第二种方式,是使用JSON方法
但遇到复杂对象时,比如内部有函数,则无法完成
所以从原理去思考,我们可以直接把一个对象的内容,去加入到一个空对象里,这样就可以解决很多问题
因为一个对象的内容是不确定的,或许是基本数据类型,我们直接赋值即可,但是遇到对象内部嵌套对象,或者数组等,那就要重新处理,因此可以用递归实现
上述代码中,第一次判断毋庸赘言是对象,所以相当于创建一个新对象,之后是简单的对象遍历,如果是基本数据类型,就直接赋值给newobj,如果内部依然是引用数据类型,再调用该函数
对于这样一个对象,内部有一个数组,我们给obj2的对象内部数组上push进一个0,发现实现了深拷贝
至此,深拷贝的实现方式就是这些了,工作中常用第二种,因为简洁,而且针对大多数对象可用。