一、JSON.parse(JSON.stringify(obj)) 是最简单的实现方式,但是有一些缺陷:
1.对象的属性值是函数时,无法拷贝。
2.原型链上的属性无法拷贝
3.不能正确的处理 Date 类型的数据
4.不能处理 RegExp
5.会忽略 symbol
6.会忽略 undefined
二、实现一个 deepClone 方法
注意事项
1.如果是基本数据类型,直接返回
2.如果是 RegExp 或者 Date 类型,返回对应类型
3.如果是复杂数据类型,递归。
4.考虑循环引用的问题
代码实现
//WeakMap解决循环引用问题
function deepClone(source,hash=new WeakMap()){
if(source instanceof RegExp) return new RegExp(source);
if(source instanceof Date) return new Date(source);
if(source === null || typeof source !== 'object'){
return source;
}
if(hash.has(source)) return hash.get(source);
const result = new source.constructor();
hash.set(source,result);
for(key in source){
if(source.hasOwnProperty(key)){
result[key] = deepClone(source[key],hash);
}
}
return result;
}