原理
需要为深拷贝
深拷贝解决方案:
方法一:
但是该方法也是有局限性的:
- 函数无法拷贝
- 正则无法拷贝
- undefined无法拷贝
- symbol无法拷贝
优点:
可以实现二级以下的深拷贝
方法二:
优点:
- 可以拷贝函数
- 可以拷贝正则
- 可以拷贝undefined
缺点:
- 二级以下无法实现深拷贝
手写
当访问的obj[key]为obj对象或数组的时候,会继续按之前的对象深拷贝操作,先判断是数组还是对象,然后再次进入for循环,如此反复直到符合第一个if(不是对象或者null),将返回值可以赋值给最深层对应的result[key],这样就实现了多级的深拷贝
result[key] = deepClone(obj[key])
我们拷贝应该是oldObj上的自身属性,其对象原型上的属性不能进行拷贝
function deepClone(obj) {
// 如果是 值类型 或 null,则直接return
if(typeof obj !== 'object' || obj === null) {
return obj
}
// 定义结果对象
let copy = {}
// 如果对象是数组,则定义结果数组
if(obj.constructor === Array) {
copy = []
}
// 遍历对象的key
for(let key in obj) {
// 如果key是对象的自有属性
if(obj.hasOwnProperty(key)) {
// 递归调用深拷贝方法
copy[key] = deepClone(obj[key])
}
}
return copy
}
测试后面两个属性