为什么_.some在没有迭代器函数的情况下运行?

时间:2013-07-22 23:59:34

标签: javascript underscore.js

如果你使用像_.some()之类的循环习惯用法,但是没有传入迭代器函数则会出错。然而,下划线将用身份功能取代它并继续运行。

为什么:来自underscore

  var any = _.some = _.any = function(obj, iterator, context) {
    iterator || (iterator = _.identity); // this line?
    var result = false;
    if (obj == null) return result;
    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
    each(obj, function(value, index, list) {
      if (result || (result = iterator.call(context, value, index, list))) return breaker;
    });
    return !!result;
  };

案例用法:

_.some([0,1,2,3], null);

2 个答案:

答案 0 :(得分:2)

  

但是没有传递迭代器函数出错的地方。

完全没有。 iterator是一个可选参数,默认情况下,_.some()将自行测试集合的元素真实性。这是demonstrated in the docs

_.some([null, 0, 'yes', false]);
=> true

iterator只允许您指定自己的条件:

_.some([ 1, 2, 3, 4, 5 ], function (x) { return x > 6; })
=> false

包括测试元素成员的真实性

_.some([ { value: 0 }, { value: 1 } ], function (x) { return x.value; });
=> true

答案 1 :(得分:1)

因为..为什么不应该运行?

这是 API设计选择,只是让它“早退”(与正常应用识别功能相比)会改变行为。这是因为身份功能有效地传递了价值观的真实性(

)。
_.some([0,undefined,null,""]) // false
_.some([1])                   // true