深拷贝函数
function deepClone(newObj, obj) {
if (obj instanceof RegExp) return new RegExp(obj)
if (obj instanceof Date) return new Date(obj)
if (obj === null) return null
for (let key in obj) {
value = obj[key]
if (value instanceof Array) { //如果对象中的值为一个数组,因为js中数组也是一种对象,所以放在上面
newObj[key] = [] // 初始化数组
deepClone(newObj[key], value) //递归实现拷贝
}
else if (value instanceof Object) { //如果对象中的值为一个对象
newObj[key] = {} // 初始化对象
deepClone(newObj[key], value) //递归实现拷贝
}
else {
newObj[key] = value //如果对象中的值为基本数据类型,直接赋值给新对象
}
}
}
上面这个实现方法会有一个问题,会出现循环引用,比如下面这段代码:
let obj = {
name: 'obj'
}
let cc = {
name: 'newObj',
age: 18,
arr: [14,15],
family: obj
}
obj.a=newObj
deepClone(a,cc)
超出最大堆栈Maximum stack exceeded,
原因是newObj里包含obj,而obj也包含newObj,这样的话就造成了deepClone一直递归调用,循环引用
解决方法: