Для начала, 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;
}