Skip to content

手写一个深拷贝要考虑哪些?

  • 循环引用
  • new Array,new Object
  • 正则、日期
  • Symbol属性
js
const deepclone = (obj, hash=new WeakMap()) => {
    if(obj instanceof Date) return new Date(obj);
    if(obj instanceof RegExp) return new RegExp(obj);

    if(obj==='null' || typeof obj !== 'object'){
        return obj;
    }

    if(hash.has(obj)) return hash.get(obj);
    let newObj = new obj.constructor();
    hash.set(obj,newObj);

    for(let key in obj){
        if(obj.hasOwnProperty(key)){
            newObj[key] = deepclone(obj[key], hash);
        }
    }

    // 处理Symbol属性
    let symbolKeys = Object.getOwnPropertySymbols(obj);
    for(let i=0; i< symbolKeys.length;i++){
        newObj[symbolKeys[i]] = deepclone(obj[symbolKeys[i]],hash);
    }

    return newObj;
}
本站访客数 人次 本站总访问量