【问题标题】:Disadvantages of Array.protoype.every over Array.prototype.forEach?Array.prototype.every 相对于 Array.prototype.forEach 的劣势?
【发布时间】:2014-02-11 05:40:37
【问题描述】:

这两种方法都遍历当前数组的元素,但只有 Array.prototype.every 允许您跳出循环,类似于您可以使用 break 退出 for 循环。

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

与我错过的 forEach 相比,Array.prototype.every 是否有任何缺点(性能、可读性等),或者为什么 every 不更常见?

这里的主要观点是,为了可读性,大多数时候我想使用 forEach 作为经典 for 循环的替代品,但鉴于没有办法跳出 for-each 循环,在这里,every 似乎更像是一个等价物。 MDN 上已经提到了使用 every 的选项。

【问题讨论】:

  • every() 方法测试数组中的所有元素是否通过提供的函数实现的测试 forEach() 方法执行提供的函数每个数组元素一次。
  • 它们并不完全一样,every() 在所有元素都满足条件时返回 true 而forEach() 为每个元素执行一个函数
  • 当然可以,但是两者都可以用来遍历数组中的每个元素。
  • @Andreas,adeneo OP 已经在问题中提到了这一点是理想的行为。
  • filtermap 也可用于遍历数组,但这并不是它们的真正用途。

标签: javascript arrays


【解决方案1】:

他们有非常不同的目的。 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,但这不是他们的目的。请注意,通过返回布尔值来打破循环并不会带来更好的可读性 :-) 我建议仅在您可以使用返回值时使用它们,即如果您需要知道循环是否提前中止。

【讨论】:

  • 你知道使用every 有什么缺点吗?就像与 forEach 相比,它们是否更慢或类似的东西。这里的重点是迭代对象上的比较操作可能很昂贵,因此如果达到某种错误条件,能够跳出循环是有道理的;-)
  • 当你不迭代所有元素时,它很可能比普通循环慢,但比 foreach 快。但是,我认为“比较”是没有意义的,因为它们的行为不同。
【解决方案2】:

every 的目的是检查数组中的每个元素是否都通过了测试——如果是这样,它会返回 true。 forEach 只是为数组的每个元素运行它的参数。所以从某种意义上说,如果你的函数返回 true,那么 each 和 forEach 是等价的。但最好是明确的——如果你想测试所有元素,使用every。如果要为每个元素执行一个函数,请使用 forEach。

【讨论】:

  • 如果你想为少于所有元素执行一个函数,你应该使用every吗?
  • 是的,你可以这样使用。
【解决方案3】:

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

区别在于返回值。

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

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

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

编辑:这是MSDN Docs if 你喜欢。

【讨论】:

  • 性能和早破不也有区别吗?
猜你喜欢
  • 2015-02-24
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多