我们程序员日常赚窝囊费的时候,肯定经常会需要拷贝一个复杂数据类型的情况,直接赋值??,那肯定不行,因为复杂数据类型都是在堆里面的,在栈里的只是一个可以指向这个复杂数据类型的内存地址,当我们直接赋值只是把内存地址赋值给它了。
控制台打印
以上可以得出,它们其实是共用一个对象!!
浅拷贝
顾名思义就是很浅的拷贝,只能拷贝一层属性,当深层次还有复杂数据类型时拷贝过来的还是内存地址。
控制台打印
可以发现拷贝的第一层是不全等的,但是当它内层还有对象时还是全等的情况。所以浅拷贝只适合拷贝数据只有一层的情况。
深拷贝(重点)
看完以上发现如果数据有多层的情况,浅拷贝是不够用的,那我们接下来就说说深拷贝。
深拷贝其实就是能拷贝对象的未知层级数据。
实现方法:JSON、递归
JSON:
控制台打印
最简单的就是使用JSON一行代码实现。但是!!
JSON.parse(JSON.stringify(obj))实现深拷贝存在的问题:
对于undefined,函数,Symbol会直接忽略
new Date()转换后结果不正确
对于正则转换为{}
对于循环引用,会报错
说到底,想要实现深拷贝,就是浅拷贝加递归,也就是如果对象的属性值还是一个对象的话,再进行一次拷贝,话不多说,上代码:
控制台打印