两种方法都迭代当前数组的元素,但只有Array.prototype.every允许你突破循环,类似于如何使用break
退出for循环。
查看browser compatibility matrixes时,两者似乎都受到相同浏览器的支持。
与{I}相比,Array.prototype.every
是否存在任何缺点(性能,可读性......),或者为什么every
更为常见?
这里的主要观点是,为了便于阅读,我希望将大部分时间用作经典for循环的替代,但鉴于没有办法打破for-each循环,在这里,每一个似乎都更相同。 MDN上提到了使用every
的选项。
答案 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 你更喜欢。