我可以选择:
var arr = [];
arr.forEach(function(i) {
i;
});
for (var i = 0, length = arr.length; i < length; ++i) {
arr[i];
}
什么时候使用其中一种而不是另一种,它们之间是否有性能差异?
我可以选择:
var arr = [];
arr.forEach(function(i) {
i;
});
for (var i = 0, length = arr.length; i < length; ++i) {
arr[i];
}
当你使用foreach时:
最后一点是主要区别:foreach操作的是副本,因此即使更改了元素,数组仍然保持完好无损,并且可以进行迭代而没有缺陷。
这个副本使得foreach比for略慢,因为它需要复制数据。请记住,一些旧的或罕见的浏览器不支持foreach,但它们支持“for”。除非你的数组非常大(10,000+项),否则忽略速度差异。它只有几毫秒。
当你使用for时:
forEach
视为数组元素。负索引也不被考虑。"foreach在副本上工作": 这是不正确的(或者至少是一种实现细节)。只有元素的范围是固定的。如果在迭代之前修改了数组的值,回调将得到新值。请参见http://es5.github.io/#x15.4.4.18。你从哪里得到它是在副本上工作的信息? - Felix Klingfor
循环来实现。总体而言,我认为你的答案包含了一些不准确的信息,特别是关于复制的事情。规范已经非常清楚地说明了如何处理修改。 - Felix Kling
forEach
操作比较慢,但它能够在每次迭代时创建一个作用域,而你通常需要在正常的for
循环中手动进行设置。此外,使用forEach
回调函数可以让您设置this
的值(使用第二个参数)。然而,并不是所有浏览器都支持forEach
: http://kangax.github.io/es5-compat-table/#Array.prototype.forEach。另外需要注意的是,`forEach` 不会遍历空项目。更多信息,请参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach - 它还包括了一个用于不支持forEach
的浏览器的 polyfill。 - IanforEach
是符合 ECMAScript 5 的。 - Moritz Roessler