1

如果您使用诸如 的循环习语_.some(),但不传入迭代器函数,则出现问题。然而,下划线将用标识函数替换它并继续运行。

这是为什么:来自下划线

  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);
4

2 回答 2

2

但不要传入迭代器函数,出现问题。

一点也不。这iterator是一个可选参数,默认情况下,_.some()将测试集合元素本身的真实性。这在文档中得到了证明

_.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
于 2013-07-23T00:24:34.023 回答
1

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

这是一个API 设计选择,只是让它“提前返回”(与正常应用识别功能相比)会改变行为。这是因为恒等函数有效地传递了值的真实性(虚假性):

_.some([0,undefined,null,""]) // false
_.some([1])                   // true
于 2013-07-23T00:09:55.437 回答