实现深拷贝的两种方式
2021-05-08 本文已影响0人
海之深处爱之港湾
// 第一种
const a = {};
const b = JSON.parse(JSON.stringfy(a));
// 第二种
function clone(obj, hash = new WeakMap()) {
// 判断是否为 null 或者 typeof 返回类型是否为 object
if (obj == null || typeof obj !== "object") return obj;
else if (obj instanceof Date) return new Date(obj);
else if (obj instanceof RegExp) return new RegExp(obj);
// 判断集合是否有这个属性,有则直接 return obj
if(hash.has(obj)) return hash.get(obj)
const newObj = new obj.constructor();
// 将属性和拷贝后的值作为一个map
hash.set(obj, newObj);
// 遍历 obj
for (let key in Object.getOwnPropertyDescriptors(obj)) {
// 过滤掉原型身上的属性
if (obj.hasOwnProperty(key)) {
// 递归拷贝
newObj[key] = clone(obj[key], hash);
}
}
return newObj;
}