深拷贝方法
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
浙公网安备 33010602011771号