相同点
-
遍历数组:两者都会遍历数组的每个元素。
-
回调参数:回调函数均接收当前元素、索引和原数组作为参数。
-
不直接修改原数组:除非在回调中显式操作原数组(如修改元素对象的属性)。
区别
特性 | map | forEach |
---|---|---|
返回值 | 返回新数组,元素为回调返回值。 | 返回 undefined 。 |
用途 | 数据转换(生成新数组)。 | 执行副作用(如修改数据、日志等)。 |
链式调用 | 支持(返回数组)。 | 不支持(返回 undefined )。 |
回调要求 | 需 return 值,否则新数组元素为 undefined 。 |
无需 return ,返回值不影响结果。 |
适用场景
1. 使用 map
的情况
-
需要生成新数组:将原数组转换为新结构。
const numbers = [1, 2, 3]; const doubled = numbers.map(num => num * 2); // [2, 4, 6]
-
保持数据不可变性(如 React 状态更新)
const updatedUsers = users.map(user => ({ ...user, age: 30 }));
-
链式操作 (结合
filter
、reduce
等):const result = arr.map(x => x * 2).filter(x => x > 4);
2. 使用 forEach
的情况
-
仅需遍历执行操作(无返回值需求):
[1, 2, 3].forEach(num => console.log(num));
-
修改原数组元素(如对象属性):
users.forEach(user => user.age = 30);
-
执行副作用(如 DOM 操作、异步请求):
elements.forEach(element => element.classList.add('active'));
总结
-
用
map
:需基于原数组生成新数组时(如数据转换)。 -
用
forEach
:只需遍历执行操作,无需返回值时(如副作用操作)。