angularjs angular.extend(src, dst)
和javascript Object.assign(src, dst)
函数之间的行为是否有区别?
使用https://stackoverflow.com/a/36828514中的测试,它们看起来都是相同的。
如果确实如此,性能是否有差异?相互使用时有什么优缺点?
答案 0 :(得分:0)
看(实际上,
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;
}