在 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
在 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
forEach
有时看起来更好,可以避免中间变量和闭包问题。
for
更快,适用于非数组,this
默认维护,并且一直是 JavaScript 的一部分。break;
你也可以用——甚至是嵌套的方式来打破它。
在 ES6 中,forEach
's this
-maintaining 和外观通过引入=>
;得到了改进。for
的冗长和有时不直观的范围通过let
和for of
循环得到改善。
正如 6502 回答的那样,它们在稀疏数组上的工作方式不同。
不要使用稀疏数组。
他们做了两件非常不同的事情:
for (var i=0; i<L.length; i++) { ... }
遍历所有索引,包括“未定义”的数组元素。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 的元素
如果您打算使用任何polyfills Array.prototype.forEach()
/shims 为旧版浏览器提供原型功能,请注意(我在看着您,InternetExplorer)。
例如,该toString()
方法不适用于旧版本 IE 中的数组。我有一个 polyfill,将toString()
方法添加到 Array.prototype 中,以便我的应用程序在旧浏览器中工作。但是,.forEach()
除了迭代数组的内容之外,使用迭代器进行迭代还可以访问(并且确实会迭代)该方法。
但总的来说,for
速度要快得多。如果有 JSON 对象你想循环通过,forEach
是天赐之物。