Object.assign()与angular.extend()

时间:2019-04-01 13:08:24

标签: javascript angularjs javascript-objects

angularjs angular.extend(src, dst)和javascript Object.assign(src, dst)函数之间的行为是否有区别?

使用https://stackoverflow.com/a/36828514中的测试,它们看起来都是相同的。

如果确实如此,性能是否有差异?相互使用时有什么优缺点?

2 个答案:

答案 0 :(得分:0)

enter image description here(实际上,baseExtend在它下面几行,并使用angular.extend),它只是一个浅表副本。一个例外是the source of angular.extend,AngularJS使用它进行对象跟踪。

如果您要处理AngularJS控制器使用的对象(例如范围变量),我建议使用baseExtend来处理特定于AngularJS的代码,而使用Object.assign

答案 1 :(得分:0)

对于初学者来说,angular.extend可以进行“深层”克隆,因此...... p

如果性能确实是您的考虑因素,那么,angular.extend绝对是一个“较慢”的过程,但实际上这没关系,除非您在大型数据集上调用它。

底线angular.extend的存在有三个原因。 1)在旧的浏览器中替换Object.assign,2)进行“深层”复制的方法,3)确保角度管理的对象用作分配对象时不会损坏呼叫。也就是说,其$$hashKey属性不会被覆盖。

如果您真的很好奇,请查看源代码:-)

function baseExtend(dst, objs, deep) {
  var h = dst.$$hashKey;

  for (var i = 0, ii = objs.length; i < ii; ++i) {
    var obj = objs[i];
    if (!isObject(obj) && !isFunction(obj)) continue;
    var keys = Object.keys(obj);
    for (var j = 0, jj = keys.length; j < jj; j++) {
      var key = keys[j];
      var src = obj[key];

      if (deep && isObject(src)) {
        if (isDate(src)) {
          dst[key] = new Date(src.valueOf());
        } else if (isRegExp(src)) {
          dst[key] = new RegExp(src);
        } else if (src.nodeName) {
          dst[key] = src.cloneNode(true);
        } else if (isElement(src)) {
          dst[key] = src.clone();
        } else {
          if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};
          baseExtend(dst[key], [src], true);
        }
      } else {
        dst[key] = src;
      }
    }
  }

  setHashKey(dst, h);
  return dst;
}