深浅拷贝!

71 阅读1分钟

我们程序员日常赚窝囊费的时候,肯定经常会需要拷贝一个复杂数据类型的情况,直接赋值??,那肯定不行,因为复杂数据类型都是在堆里面的,在栈里的只是一个可以指向这个复杂数据类型的内存地址,当我们直接赋值只是把内存地址赋值给它了。

image.png

控制台打印

image.png

以上可以得出,它们其实是共用一个对象!!

浅拷贝

顾名思义就是很浅的拷贝,只能拷贝一层属性,当深层次还有复杂数据类型时拷贝过来的还是内存地址。

image.png

控制台打印

image.png

可以发现拷贝的第一层是不全等的,但是当它内层还有对象时还是全等的情况。所以浅拷贝只适合拷贝数据只有一层的情况。

深拷贝(重点)

看完以上发现如果数据有多层的情况,浅拷贝是不够用的,那我们接下来就说说深拷贝。

深拷贝其实就是能拷贝对象的未知层级数据。

实现方法:JSON、递归

JSON:

image.png

控制台打印

image.png

最简单的就是使用JSON一行代码实现。但是!!

JSON.parse(JSON.stringify(obj))实现深拷贝存在的问题:

对于undefined,函数,Symbol会直接忽略

new Date()转换后结果不正确

对于正则转换为{}

对于循环引用,会报错

说到底,想要实现深拷贝,就是浅拷贝加递归,也就是如果对象的属性值还是一个对象的话,再进行一次拷贝,话不多说,上代码:

image.png image.png

控制台打印

image.png