首页 > 技术文章 > 深拷贝

zhenjianyu 2020-05-26 12:39 原文

  • 未解决循环引用问题
function deeoCopy(obj){
    let res
  if(typeof obj === 'object'){
    res = obj instanceof Array ? [] : {}
    for(var key in obj){
      if(obj.hasOwnProperty(key)){
        res[key] = typeof obj[key] == 'object' ? deeoCopy(obj[key]) : obj[key]
      }
    }
  }else{
    res = obj
  }
  return res
}
  • 已解决循环引用问题
function deepCopy(obj) {
    // hash表,记录所有的对象的引用关系
    let map = new WeakMap();
    function dp(obj) {
        let result = obj instanceof Array ? [] : {};
        let keys = Object.keys(obj);
        let existobj = map.get(obj);
        //如果这个对象已经被记录则直接返回
        if (existobj) {
            return existobj;
        }
        map.set(obj, result);
        for (let i = 0, len = keys.length; i < len; i++) {
            let key = keys[i];
            let temp = obj[key];
            if (temp && typeof temp === 'object') {
                result[key] = dp(temp);
            } else {
                result[key] = temp;
            }
        }
        return result;
    }
    return dp(obj);
} 

 

function deepCopy(obj) {
    let set = new WeakSet();
    function dp(obj) {
        let result = obj instanceof Array ? [] : {};
        let keys = Object.keys(obj);
        let existobj = set.has(obj);
        if (existobj) {
            return obj;
        }
        set.add(obj);
        for (let i = 0, len = keys.length; i < len; i++) {
            let key = keys[i];
            let temp = obj[key];
            if (temp && typeof temp === 'object') {
                result[key] = dp(temp);
            } else {
                result[key] = temp;
            }
        }
        return result;
    }
    return dp(obj);
}

循环引用

let obj = {}
obj.a = {}
obj.a.b = obj.a

let obj = {}
obj.a = {}
obj.c = {}
obj.a.b = obj.c
obj.c.d = obj.a

推荐阅读