_.reduce如何在_.every下划线js重新实现中工作

问题描述

我一直对_.reduce整天在这里工作感到困惑。

_.every = function(collection,iterator) {
    var check = iterator || _.identity;
    var result = _.reduce(collection,function(accumulator,val) {
      return accumulator && !!check(val);
    },true);
    return result;
  };
  
  console.log(_.every([true,false,1,2,3,4],_.identity)); // ===> false

据我所知_.reduce遍历集合,对于每个元素,在数组中的每个元素上调用iterator(accum,val),然后返回累加器,但我不知道在哪一行4正在执行:返回累加器&& !! check(val);。为什么它不检查false,将其设置为累加器,然后检查1并将其设置为累加器,然后继续处理数组的其余部分,直到达到4,这意味着最后一个累加器为true?抱歉,如果这样做没有道理。

解决方法

.every本质上是复合词&&。如果每个元素也都产生true,则结果应仅为true

所以在这一行代码中...

return accumulator && !!check(val);

... accumulator是到目前为止的值。

如果累加器为true,那么到目前为止一切都很好。它将在数组的当前元素上调用check,将结果转换为布尔值,然后将其返回。返回值将成为下一步的accumulator

如果累加器为false,那是因为数组中较早的内容返回了false。这意味着我们已经失败了,不需要继续检查数组的其余部分。即使数组后面的内容返回true也没关系。因此,该表达式将返回false,甚至不打扰check