Array.prototype.every的缺点是Array.prototype.forEach?

时间:2014-01-21 14:46:58

标签: javascript arrays

两种方法都迭代当前数组的元素,但只有Array.prototype.every允许你突破循环,类似于如何使用break退出for循环。

查看browser compatibility matrixes时,两者似乎都受到相同浏览器的支持。

与{I}相比,Array.prototype.every是否存在任何缺点(性能,可读性......),或者为什么every更为常见?

这里的主要观点是,为了便于阅读,我希望将大部分时间用作经典for循环的替代,但鉴于没有办法打破for-each循环,在这里,每一个似乎都更相同。 MDN上提到了使用every的选项。

3 个答案:

答案 0 :(得分:4)

他们有着截然不同的目的。虽然forEach为每个元素执行具有副作用(功能不是很强大)的函数并且不返回任何内容,every是一种函数方法,用于测试所有元素是否满足给定谓词并返回布尔值。此外,every确实期望返回boolean的回调 - 大多数forEach回调都不会。

举个例子:

> [1,2,3].forEach(console.log)
1
2
3
undefined
> [1,2,3].every(console.log)
1
false

如果您想使用迭代方法并且需要突破,那么您可能会滥用some / every,但这不是它们的用途。请注意,通过返回布尔值来打破循环并不会带来更好的可读性:-)我建议只有在你可以使用返回值时使用它们,即如果你需要知道循环是否过早中止。

答案 1 :(得分:0)

every的目的是检查数组中的每个元素是否符合测试 - 并且返回true就是这样。 forEach只为数组的每个元素运行其参数。因此,从某种意义上说,如果函数返回true,则每个和forEach都是等价的。但最好是明确的 - 如果你想测试所有元素,请使用每个元素。如果要为每个元素执行函数,请使用forEach。

答案 2 :(得分:0)

从这个确切的问题:map, foreach and every

  

区别在于返回值。

     

.map()   返回通过对原始项目执行某些操作而创建的新对象数组

     

.every()   返回布尔值 - 如果此数组中的每个元素都满足提供的测试函数,则为true。与...有重要区别   .every()是可能并不总是要求测试函数   数组中的每个元素。一旦测试函数返回false   对于任何元素,不再迭代数组元素。因此,   测试功能通常应该没有side effects

     

.forEach()   不返回任何内容 - 它迭代数组,为数组中的每个项执行给定的操作。

     

修改:这是MSDN Docs if   你更喜欢。