我们都知道在js中,变量分为值类型和引用类型,对于值类型来说,它在赋值是一种传值赋值,即直接原原本本拷贝一份;而对于引用类型(对象、数组、函数)来说,由于体积较大,它们在赋值时是一种传址赋值,也就是说,仅仅把一个指向引用类型的指针复制过去,这是一种浅拷贝;而要真正地拷贝引用类型本身,就要用到深拷贝。
我在阮一峰的博客里,看到了关于他对于深拷贝的定义:
这里为什么不提函数呢?我的理解是,函数在定义之后,如果需要使用它,直接拿过来使用就好了,不需要传址赋值;如果函数进行传值赋值,则没有意义,为什么不新定义一个函数呢?(逻辑修改是很复杂的)
对于深拷贝的方法,网上有很多,比如说用Object.assign(),但是这种方法有一个弊端,就是只能实现一层对象的深拷贝,如果对象里面嵌套了对象,这种方法就不行了;
还有一种说法是用JSON.parse(JSON.stringify()),这种方法虽然简单,但是它的弊端在于,如果对象属性值为function,是不能转化为JSON的。
我提出一个方案,大家来研究研究: