Javascript 为什么在if条件下需要进行额外检查?

Javascript 为什么在if条件下需要进行额外检查?,javascript,underscore.js,Javascript,Underscore.js,以上是下划线.js中任意方法的实现。 当测试以下行中谓词方法的结果时 var any = _.some = _.any = function(obj, predicate, context) { predicate || (predicate = _.identity); var result = false; if (obj == null) return result; if (nativeSome && obj.some === native

以上是下划线.js中任意方法的实现。
当测试以下行中谓词方法的结果时

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

result
从一开始就是
false
,当调用
predicate
函数将
result
变量设置为true时,循环终止。因此,在我看来,第一次检查
结果
变量的值总是
false
。为什么要对这个变量进行额外的测试?

我在github上发现了一个问题,作者是lshear

当存在本机forEach函数时,使用 最后一项未通过真理测试的列表 始终返回false(即使列表中的任何其他项通过 真理测试)。问题是本机forEach函数没有 短路(回路断路器;对其无影响)。因此, 返回调用u的结果。任何结果都将被最后一个 项目

如果查看
每个
的实现,它将使用本机forEach(如果可用)

if (result || (result = predicate.call(context, value, index, list)))
//基石,一个'each'实现,又称'forEach'。
//使用内置的“forEach”、数组和原始对象处理对象。
//委派到**ECMAScript 5**的本机“forEach”(如果可用)。
var each=u0.each=0.forEach=函数(对象、迭代器、上下文){
如果(obj==null)返回obj;
if(nativeForEach&&obj.forEach===nativeForEach){
forEach(迭代器,上下文);
}否则如果(对象长度===+对象长度){
对于(变量i=0,长度=obj.length;i

显然,额外的检查是必要的。

结果可以在each()回调中随时设置。如果结果不是falsy,则each()函数会提前终止,就像实际的[]。某些下划线()会被撕裂并减慢…@dandavis result只能由谓词设置。call(),否?
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects with the built-in `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
  if (obj == null) return obj;
  if (nativeForEach && obj.forEach === nativeForEach) {
    obj.forEach(iterator, context);
  } else if (obj.length === +obj.length) {
    for (var i = 0, length = obj.length; i < length; i++) {
      if (iterator.call(context, obj[i], i, obj) === breaker) return;
    }
  } else {
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
    }
  }
  return obj;
};