我整天都不明白_.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,它经过集合,对于每个元素,迭代器(accum,val(在数组中的每个元素上被调用,然后返回累加器,但我不明白第4行在做什么:return accumulator&!!check(val(;。为什么它不检查false,将其设置为累加器,然后转到检查1,将其设为累加者,然后转到数组的其余部分,直到它变为4,这意味着最后一个累加器是true?如果这没有道理,我很抱歉。
.every
基本上是一个化合物&&
。如果每个元素也产生true
,则结果应该仅为true
。
所以在这行代码中。。。
return accumulator && !!check(val);
accumulator
是迄今为止的值。
如果累加器是true
,那么到目前为止一切都很好。它将对数组的当前元素调用check
,将结果转换为布尔值,然后返回。返回的值在下一步中变为accumulator
。
如果累加器是false
,那是因为数组中较早的部分返回了false
。这意味着我们已经失败了,没有必要继续检查数组的其余部分。即使数组中稍后的某个内容返回true
,也无关紧要。因此,这个表达式将返回false
,甚至不需要调用check
。