在遍历数组时应该使用for-of还是forEach?

14 javascript ecmascript-6

另外,这是样式问题还是功能问题?是偏好问题还是更好?我试图了解目的。

通常我用

let iterable = [10, 20, 30];

iterable.forEach((val) => {
   console.log(val);
})
Run Code Online (Sandbox Code Playgroud)

但我看到这种新语法可用。

let iterable = [10, 20, 30];

for (let value of iterable) {
  console.log(value);
}
Run Code Online (Sandbox Code Playgroud)

能否提供一个最佳用例的例子,当有人使用它时可能会有所启发?

Lui*_*noz 12

这是一个非常有趣的问题,已经在许多其他站点中进行了讨论。我将发布已阅读内容的基础知识。

ForEach完全属于Arrays皇室家族。forEach方法是沿袭引入Array对象的原型继承!不用说,forEach子句仅适用于数组数据结构。该方法基本上遍历数组的元素并执行回调函数[基本上是一些可执行的函数/ fun活动]。


for-of循环对于JS世界来说是很新的东西,并且具有超能力!瞧!for-of循环创建一个遍历可迭代成员对象的循环。该列表是一个广泛的列表,例如

  • 数组
  • 地图
  • TypedArray
  • 其他W3C类

您需要知道,这个坏蛋男孩是在2015年ES6诞生时出现的。因此,它在使用上提供了足够的灵活性


性能

在性能上for...of比快forEach结果可以在这里找到

forEach 比慢24% for...of


更新资料

如上所述,W3C规范中还有其他几个可迭代的类,例如FileList。在W3C的最新草案中(大约在ES6发布时),诸如HTMLCollection和NodeList之类的集合现在也实现了forEach(),而不仅仅是Array。通过@帕特里克·罗伯茨


来源链接:

  • 在最新的Firefox中,“ forEach”要比“ for of”要快,但是在chrome中,“ for of”要快。 (3认同)
  • 该列表仅提及ECMAScript规范中的类。如上所述,W3C规范中还有其他几个可迭代的类,例如“ FileList”。在W3C的最新草稿中(大约在ES6发布时),像HTMLCollection和NodeList这样的集合现在也实现了forEach(),而不仅仅是数组。 (2认同)
  • 除非有根本原因导致某些结构更难优化,否则这些基准比较<极其>脆弱。例如,在最新的 v8 版本 10.4.123.20 上,我发现 `for...of`、`for` 和 `forEach` 基本上具有相同的性能。 (2认同)

Ber*_*rgi 7

我建议始终for … of在ES6中使用。

  • 它适用于任何迭代
  • 它支持各种控制流的循环体,比如continuebreakreturnyieldawait

我个人也觉得它更具可读性,但这取决于偏好。有人认为这forEach是一种更具功能性的样式,但这是错误的-它没有结果价值,而且全都在产生副作用,因此,看起来强制性的循环更适合该目的。

性能不是问题,在现代引擎中,所有循环样式都是等效的

  • 那么对于不同的用例,你根本不需要 `await`,所以你可以只写 `for (const value of [1,2,3]) { new Promise(resolve => console.log(value) ); }` (6认同)
  • @Forivin [不起作用](/sf/ask/2630367981/),将不会等待循环。您的代码等效于仅创建承诺,而根本不使用`async` /`await`。 (2认同)

归档时间:

查看次数:

3712 次

最近记录:

6 年,7 月 前