在 JavaScript 中,数组的 forEach 方法和 map 方法在功能与返回值上存在哪些差异?
考察说明
考查对 JavaScript 数组高阶方法 forEach 与 map 的语义、返回值及典型使用场景的理解。
回答思路
- 【回答框架 1】forEach 用于对数组每个元素执行副作用操作,仅遍历并调用回调函数,不返回新数组,其返回值为 undefined。
- 【回答框架 2】map 通过回调函数对每个元素进行映射转换,返回一个由每次调用结果组成的新数组,原数组保持不被修改。
- 【回答框架 3】forEach 适合执行打印、修改外部变量、发送请求等副作用场景;map 适合将原数组元素转换成新数据结构的纯函数式场景。
- 【回答框架 4】二者都不会自动中断,如需提前退出应改用 for 循环、for...of 配合 break,或使用 every、some 等方法。
- 【回答框架 5】map 的每次回调必须返回一个值用于构造新数组,若不返回则新数组对应位置为 undefined;forEach 的回调返回值被忽略。
- 【关键点 1】forEach 返回 undefined,map 返回新数组。
- 【关键点 2】map 能链式调用,forEach 不能直接链式继续数组操作。
- 【关键点 3】二者均不修改原数组(但回调内可修改外部变量或对象属性)。
- 【关键点 4】性能差异通常不大,选择依据是是否需要新数组。
- 【关键点 5】在空数组中调用二者都不会执行回调,返回空数组或 undefined。
- 【易错点 1】误认为 map 可以替代 forEach 进行副作用操作,导致创建无用数组。
- 【易错点 2】在回调中使用 async 时,forEach 不等待异步完成,需用 for...of 或 Promise.all 处理。
- 【易错点 3】试图用 break 或 return 中断 forEach/map,实际无法中断,需要改用其他循环方式。