7

在 JavaScript 中使用 Array.prototype.forEach() 与 for() 迭代数组的优缺点是什么?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

4

3 回答 3

5

forEach有时看起来更好,可以避免中间变量和闭包问题。

for更快,适用于非数组,this默认维护,并且一直是 JavaScript 的一部分。break;你也可以用——甚至是嵌套的方式来打破它。

在 ES6 中,forEach's this-maintaining 和外观通过引入=>;得到了改进。for的冗长和有时不直观的范围通过letfor of循环得到改善。

正如 6502 回答的那样,它们在稀疏数组上的工作方式不同。
不要使用稀疏数组。

于 2013-09-12T20:34:52.657 回答
1

他们做了两件非常不同的事情:

  1. for (var i=0; i<L.length; i++) { ... }遍历所有索引,包括“未定义”的数组元素。
  2. forEach仅对定义的元素进行迭代。

另请注意,“未定义”不仅仅意味着元素的undefined,而是从未设置过的元素,两者是非常不同的东西:

a = [];
a[3] = 9;
a.indexOf(undefined) // --> -1
a[1] = undefined;
a.indexOf(undefined) // --> 1

所以你可以有一个具有价值的定义元素undefined......

a = [];
a[9] = 9;
a[3] = undefined;

a.forEach(function(){ console.log(arguments); });

将显示两行,一行用于索引为 9 的元素,另一行用于索引为 3 的元素

于 2013-09-12T20:39:37.223 回答
0

如果您打算使用任何polyfills Array.prototype.forEach()/shims 为旧版浏览器提供原型功能,请注意(我在看着您,InternetExplorer)。

例如,该toString()方法不适用于旧版本 IE 中的数组。我有一个 polyfill,将toString()方法添加到 Array.prototype 中,以便我的应用程序在旧浏览器中工作。但是,.forEach()除了迭代数组的内容之外,使用迭代器进行迭代还可以访问(并且确实会迭代)该方法。

但总的来说,for速度要快得多。如果有 JSON 对象你想循环通过,forEach是天赐之物。

于 2013-09-12T20:39:26.417 回答