咨询电话:
15628812133
15
2023/09

深拷贝浅拷贝的介绍及其实现方式

发布时间:2023-09-15 16:32:57
发布者:MaiMai
浏览量:
0

上一章我们利用JSON.stringify()与JSON.parse()方法实现了深拷贝,但是这种方法存在很多弊端,如对象的属性值是函数时,无法拷贝;不能解决循环引用的问题;无法拷贝特殊对象,比如:RegExp、BigInt、Date、Set、Map等。这一章我们来详细介绍一下深拷贝与浅拷贝。

首先要知道,js中数据类型分为基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol)和对象数据类型 ( Object ),像 Array、Function、Date...等都属于 Object,它们的值都是对象。

引用数据型在被创建时,首先要在栈上给其引用分配一块内存,而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆中对象的地址。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体。

浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。而深拷贝则是层层拷贝,会另外创造一个一模一样的对象,新对象跟原对象不共享内存。我们常用的拷贝数组的方法,如concat()、slice()、Array.from(),都是浅拷贝,除此之外,数组的其他方法如map()、filter()、reduce(),都是会造成浅拷贝的。

要实现浅拷贝,可以利用Object.assign方法或for in方法。

Object.assign方法

for in方法

而上一章提到的实现深拷贝的方法,除了利用JSON.stringify()与JSON.parse()方法外,最好的办法是利用递归实现。可以解决JSON方法所遗留的弊端。

递归实现深拷贝

关键词:
返回列表