js深拷贝的演进

最终形态

// 深拷贝
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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • title: JS浅拷贝与深拷贝的学习记录date: 2017年9月21日 23:26:14tags: jscat...
    是ADI呀阅读 1,781评论 1 1
  • 这次的学习深拷贝参考了子匠大大的文章:《JavaScript中对象的深拷贝》 JSON.parse()&JSON....
    这名字真不对阅读 8,413评论 0 0
  • 基本知识 Java在运行时的内存使用分两块:栈内存与堆内存。 只就变量而言,栈内存上分配一些基本类型的变量(如in...
    野梦M阅读 3,663评论 0 1
  • 深拷贝JS中的任何对象都不是一件容易的事情,你将会遇到这样的问题,从object的原型中,错误的选择应该留在原型上...
    mervynyang阅读 3,795评论 0 5
  • 在南宋末年的江湖里,李莫愁是一个异类,是一个突兀的存在。 在那个时代,她这样年纪的女性在社会上都有归属,是某人的妻...
    西湘阅读 12,803评论 47 60