【问题标题】:What are the pros/cons of iterating an array with Array.prototype.forEach() versus for() in Javascript在 Javascript 中使用 Array.prototype.forEach() 与 for() 迭代数组的优缺点是什么
【发布时间】:2013-09-17 09:40:54
【问题描述】:
【问题讨论】:
标签:
javascript
arrays
for-loop
foreach
【解决方案1】:
forEach 有时看起来更好,可以避免中间变量和闭包问题。
for 更快,适用于非数组,默认维护this,并且一直是 JavaScript 的一部分。你也可以用break; 打破它——甚至是嵌套的。
在 ES6 中,forEach 的 this-maintaining 和外观通过引入 => 得到了改进; for 的冗长和有时不直观的范围通过 let 和 for of 循环得到改善。
正如 6502 所回答的,它们在稀疏数组上的工作方式不同。
不要使用稀疏数组。
【解决方案2】:
如果你打算使用任何 polyfills/shims 为旧版浏览器提供原型功能,请注意 Array.prototype.forEach()(我在看着你,InternetExplorer)。
例如,toString() 方法不适用于旧版本 IE 中的数组。我有一个 polyfill,它将 toString() 方法添加到 Array.prototype 中,以便我的应用程序可以在旧版浏览器中运行。但是,使用 .forEach() 迭代器进行迭代除了迭代数组的内容外,还可以访问(并且确实会迭代)该方法。
不过,一般来说,for 要快得多。如果有 JSON 对象你想循环,forEach 是天赐之物。
【解决方案3】:
他们做了两件非常不同的事情:
-
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 的元素