`_.defaults`和`_.extend`之间有什么实际区别?

时间:2015-07-10 11:55:04

标签: javascript underscore.js

我一直在使用_.extends作为在我的主干视图中获取默认选项的方法,如下所示:

options = _.extend({
    field: 'default-val'
}, options);

现在我最近发现_.defaults方法似乎也是这样做的,只有倒置的参数:

options = _.defaults(options, {
    field: 'default-val'
});

除了切换的参数,我找不到这些函数是如何不同的。那么这两个函数之间的实际区别是什么?

2 个答案:

答案 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] 时才在默认值中未定义