深拷贝方法

1)JSON.stringify()

JSON.parse(JSON.stringify(obj))是目前比较常用的深拷贝方法之一,它的原理就是利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象。
这个方法可以简单粗暴的实现深拷贝,但是还存在问题,拷贝的对象中如果有函数,undefined,symbol,当使用过JSON.stringify()进行处理之后,都会消失。
(2)函数库lodash的_.cloneDeep方法

该函数库也有提供_.cloneDeep用来做 Deep Copy

(3)手写实现深拷贝函数

步骤:

先判断map中是否已经存在(已经拷贝过了),存在则返回,防止循环引用(进入死循环会导致栈内存溢出)
判断(instanceof)当前类型是不是Object,如果不是直接返回target
如果是,再判断其是不是数组,函数,正则(RegExp),日期,或者是普通对象,对应的创建不同类型的数据
数组:newobj=[]
函数:newobj=function(){return target.call(this,...arguments)}
正则:newobj=new RegExp(target.source,target.flags)
日期:newobj=new Date(target)
普通对象:newobj={}
4,加入map进行标记 map.set(target,newobj)

5,遍历target的属性,如果是自身的属性,则递归赋值给新对象 newobj[key]=dd(target[key],map)

6,返回新对象newobj

posted @ 2022-06-24 09:44  lyy1996  阅读(114)  评论(0)    收藏  举报