Object.assign () против angular.extend () - PullRequest
0 голосов
/ 01 апреля 2019

Есть ли разница в поведении между функциями angularjs angular.extend(src, dst) и javascript Object.assign(src, dst)?

При использовании теста из https://stackoverflow.com/a/36828514, они оба кажутся идентичными.

Если они действительно есть, есть ли разница в производительности?Каковы плюсы и минусы использования одного над другим?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Для начала, angular.extend имеет возможность сделать "глубокий" клон, так что есть ...

Если производительность действительно важна для вас, тогда да, 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;
}
0 голосов
/ 01 апреля 2019

Глядя на источник angular.extend (на самом деле baseExtend, angular.extend на несколько строк ниже и использует baseExtend), это просто мелкая копия. Единственным исключением является то, что копирует $$hashKey свойство , которое используется AngularJS для отслеживания объектов.

Я бы предложил использовать Object.assign для кода, не относящегося к AngularJS, а angular.extend, если вы имеете дело с объектами, используемыми контроллерами AngularJS (такими как переменные области видимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...