Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
forEach() 方法对数组的每个元素执行一次给定的函数。
为数组中每个元素执行的函数。并会丢弃它的返回值。该函数被调用时将传入以下参数:
element数组中正在处理的当前元素。
index数组中正在处理的当前元素的索引。
array调用了 forEach() 的数组本身。
thisArg 可选执行 callbackFn 时用作 this 的值。参见迭代方法。
undefined。
forEach() 方法是一个迭代方法。它按索引升序地为数组中的每个元素调用一次提供的 callbackFn 函数。与 map() 不同,forEach() 总是返回 undefined,而且不能继续链式调用。其典型的用法是在链式调用的末尾执行某些操作。
callbackFn 仅对已赋值的数组索引调用。对于稀疏数组中的空槽,它不会被调用。
forEach() 不会改变其调用的数组,但是,作为 callbackFn 的函数可以更改数组。请注意,在第一次调用 callbackFn 之前,数组的长度已经被保存。因此:
警告:上述类型的并发修改经常导致难以理解的代码,通常应避免(特殊情况除外)。
forEach() 方法是通用的。它只期望 this 值具有 length 属性和整数键的属性。
除非抛出异常,否则没有办法停止或中断 forEach() 循环。如果有这样的需求,则不应该使用 forEach() 方法。
可以通过像 for、for...of 和 for...in 这样的循环语句来实现提前终止。当不需要进一步迭代时,诸如 every()、some()、find() 和 findIndex() 等数组方法也会立即停止迭代。
forEach() 期望的是一个同步函数,它不会等待 Promise 兑现。在使用 Promise(或异步函数)作为 forEach 回调时,请确保你意识到这一点可能带来的影响。
如果希望按顺序的或者并发的执行一系列操作,可以查看 promise 组合。
如你所见,不会为索引 2 处的缺失值调用回调函数。
备注:为了在控制台中显示数组的内容,你可以使用 console.table() 来展示经过格式化的数组。下面的例子则是另一种使用 forEach() 的格式化的方法。
下面的代码会为每一个数组元素输出一行记录:
举个勉强的例子,按照每个数组中的元素值,更新一个对象的属性:
因为 thisArg 参数(this)传给了 forEach(),每次调用时,它都被传给 callbackFn 函数,作为它的 this 值。
下面的代码会创建一个给定对象的副本。创建对象的副本有不同的方法,以下是只是一种方法,并解释了 Array.prototype.forEach() 是如何使用 Object.* 实用工具函数。
下面的例子会输出 one, two, four。
当到达包含值 two 的项时,整个数组的第一个项被移除了,这导致所有剩下的项上移一个位置。因为元素 four 正位于在数组更前的位置,所以 three 会被跳过。
forEach() 不会在迭代之前创建数组的副本。
下面的示例仅用于学习目的。如果你想使用内置方法来扁平化数组,你可以考虑使用 Array.prototype.flat()。
forEach() 方法读取 this 的 length 属性,然后访问每个整数索引。
| ECMAScript® 2027 Language Specification # sec-array.prototype.foreach |
启用 JavaScript 以查看此浏览器兼容性表。