如何在每个下划线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,它经过集合,对于每个元素,迭代器(accum,val(在数组中的每个元素上被调用,然后返回累加器,但我不明白第4行在做什么:return accumulator&amp!!check(val(;。为什么它不检查false,将其设置为累加器,然后转到检查1,将其设为累加者,然后转到数组的其余部分,直到它变为4,这意味着最后一个累加器是true?如果这没有道理,我很抱歉。

.every基本上是一个化合物&&。如果每个元素也产生true,则结果应该仅为true

所以在这行代码中。。。

return accumulator && !!check(val);

accumulator是迄今为止的值。

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

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

最新更新