我一直在使用_.extends
作为在我的主干视图中获取默认选项的方法,如下所示:
options = _.extend({
field: 'default-val'
}, options);
现在我最近发现_.defaults
方法似乎也是这样做的,只有倒置的参数:
options = _.defaults(options, {
field: 'default-val'
});
除了切换的参数,我找不到这些函数是如何不同的。那么这两个函数之间的实际区别是什么?
答案 0 :(得分:3)
.defaults
不会覆盖.extend
所在的现有值。
在第一个示例中,options
将是对创建和覆盖的新对象的引用。
在第二个示例中,options
只有在没有field
属性时才会更改。
答案 1 :(得分:2)
如果我们查看source,我们可以看到
_.extend = createAssigner(_.allKeys);
_.defaults = createAssigner(_.allKeys, true);
和
var createAssigner = function(keysFunc, undefinedOnly) {
return function(obj) {
var length = arguments.length;
if (length < 2 || obj == null) return obj;
for (var index = 1; index < length; index++) {
var source = arguments[index],
keys = keysFunc(source),
l = keys.length;
for (var i = 0; i < l; i++) {
var key = keys[i];
if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
}
}
return obj;
};
};
所以在extend
总是从 source 中分配值,但只有当 obj [key] 时才在默认值中未定义