先明确目的再选方法:逐个处理用forEach/for...of,筛选用filter,变形用map,查找用find/findIndex,汇总用reduce;分三步练习,慎用for...in,注意箭头函数和reduce初始值。

直接上手练,别先背 API。数组遍历的核心不是记住方法名,而是理解“我要做什么”——是逐个处理、挑出几个、变形成新结构,还是汇总成一个值。
先分清目的,再选方法
看到一个数组操作需求,第一反应不该是“用哪个方法”,而是问自己:
- 我只是想打印或发请求,不产生新数据 → 用 forEach 或 for...of
- 我要从原数组里挑出符合条件的项 → 用 filter
- 我要把每个元素转成另一种形式(比如加单位、取属性)→ 用 map
- 我要找第一个匹配的元素或它的位置 → 用 find 或 findIndex
- 我要把一堆数加起来、拼成字符串、统计分类 → 用 reduce
动手分三步走,别跳阶段
很多同学卡在“知道但不会用”,是因为跳过了中间练习环节:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 第一步:单方法闭环练习 —— 每个方法只做一件事,比如只写 filter,不加 map;只写 reduce,不嵌套。目标是搞清回调参数顺序、返回值类型、是否修改原数组
- 第二步:组合链式调用 —— 比如“筛选出状态为 active 的用户 → 按年龄降序 → 只取姓名和头像” → filter().sort().map()
- 第三步:还原真实场景 —— 拿接口返回的真实数组(比如用户列表、订单数组)练,加空值判断、类型校验、错误兜底
绕不开的 for 循环,什么时候该用
for 循环不是过时了,而是适用场景变了:
- 需要中途 break 或 continue(forEach 不支持)
- 要同时处理多个数组(比如对比两个数组的对应项)
- 性能敏感且数组极大(比如上万条渲染前预处理),for 循环开销略低
- 逻辑复杂到回调函数里堆太多 if/else,反而不如 for 清晰
容易踩的坑,提前避开
这些细节项目里天天见,但新手常忽略:
- 箭头函数 + thisArg 失效:map/filter 的第二个参数 thisArg 对箭头函数没用,因为箭头函数不绑定 this
- forEach 不能 return 出结果:它永远返回 undefined,想收集数据请用 map 或 filter
- for...in 不适合数组:它会遍历原型链和自定义属性,拿到的 key 是字符串,不是数字索引
- reduce 初始值别漏:空数组调用 reduce 且没给初始值,会直接报错

















