利用 constrator 实现对象数组的深拷贝

174 阅读1分钟
//因为 a == null 但是 a 不全等与 null,所以利用双等号就可以直接实现对于 null 和 undefined 的判断
//使用哈希表这种方式记录已经过克隆过的, 并且利用 WeakMap() 来实现弱引用防止内存泄漏
function deepClone(origin, hashMap = new WeakMap()){
    if (origin == undefined || typeof origin !== 'object'){
        return origin;
    }
    
    //Date 的情况
    if (origin instanceof Date){
        return new Date(origin);
    }
    
    //RegExp 的情况
    if (origin instanceof RegExp){
        return new RegExp(origin);
    }
    
    //{} []
    //以前是通过 Object.prototype.toString 来判断是数组还是对象,再进行相应的拷贝
    //现在我们可以通过 new 一个被拷贝对象的 constructor 来进行拷贝
    const hasKey = hashMap.get(origin);
    if (hasKey){
        return origin;
    }
    
    const target = new origin.constructor();
    hashMap.set(origin, target);
    for (const k in origin){
        if (origin.hasOwnProperty(k)){
            //通过构造器进行直接
            target[k] = deepClone(origin[k], hashMap);
        }
    }
    
    return target
}
const obj1 = {
    name: '张三',
    age: '18',
    job: ['计算器网络', 'js', { web: 'html', web_style: 'css' }],
    hobby: {
        ball: '大师',
        cats: '网站'
    }
}
const obj2 = deepClone(obj1);
console.log(obj1);
obj2.age = 22;
obj2.job[2].web = 'xml';
console.log(obj2);
const obj3 = {}
const obj4 = {}
obj3.obj4 = obj4
obj4.obj3 = obj3
console.log(obj3)
console.log(obj4)