美文网首页
js深拷贝的演进

js深拷贝的演进

作者: 任无名F | 来源:发表于2017-08-12 08:21 被阅读0次

最终形态

// 深拷贝
function deepCopy(data) {
  if(data === undefined || data === null) return data;
  let __copy;
  if(data instanceof Date) __copy = new Date(data);
  else __copy = new data.constructor();
  for(let key in data) {
    if(!data.hasOwnProperty(key)) continue;
    let item = data[key];
    if(item instanceof Object) {
      __copy[key] = deepCopy(item);
    } else {
      __copy[key] = item;
    }
  }
  return __copy;
}

// 深度合并
function deepAssign(origin, obj) {
  if(arguments.length > 2) {
    return deepAssign(deepAssign(arguments[0], arguments[1]), ...([].slice.call(arguments, 2)));
  }
  for(const key in obj) {
    if(!Object.prototype.hasOwnProperty.call(obj, key)) ;
    else {
      let item = obj[key],
          o = origin[key],
          isObj = item instanceof Object,
          isArr = item instanceof Array;
      if(!o || o.constructor !== item.constructor) {
        origin[key] = isArr ? [].concat(item) : isObj ? deepAssign({}, item) : item;
      } else {
        origin[key] = isArr ? o.concat(item) : isObj ? deepAssign(o, item) : item;
      }
    }
  }
  return origin;
}

相关文章

网友评论

      本文标题:js深拷贝的演进

      本文链接:https://www.haomeiwen.com/subject/igydrxtx.html