前言
在现代 JavaScript 开发中,函数式编程思想越来越普及。掌握数组的各种遍历方法,不仅能让你的代码更简洁(告别传统的 for 循环),还能显著提升代码的可读性和可维护性。
一、 基础遍历与映射
1. forEach():纯粹的遍历
- 作用:依次遍历数组子项。
- 返回值:始终为
undefined。 - 注意:无法在中途使用
break或continue跳出循环。
2. map():加工与映射
- 作用:对数组每一项执行操作,并返回一个新数组。
- 特点:原数组不变,新数组长度与原数组一致。
JavaScript
const arr = [1, 2, 3];
const newArr = arr.map((item, index) => item + index);
// [1, 3, 5]
二、 过滤与查找
1. filter():条件的筛选
- 作用:返回所有符合条件的成员组成的新数组。
- 注意:回调函数应返回一个 Boolean 值。
JavaScript
const arr = [1, 2, 3, 4, 5];
const filtered = arr.filter(item => item > 4); // [5]
2. find() & findIndex():精准定位
- find() :寻找并返回第一个满足条件的成员。找不到则返回
undefined。 - findIndex() :同上,但返回的是该成员的下标。找不到则返回
-1。
三、 逻辑判断:some() 与 every()
这两个方法就像数组的“逻辑开关”,返回布尔值。
- some() :只要有一个元素满足条件,就返回
true(一真即真)。 - every() :必须所有元素都满足条件,才返回
true(一假即假)。
JavaScript
const arr = [1, 2, 3];
console.log(arr.some(item => item === 3)); // true
console.log(arr.every(item => item === 3)); // false
四、 终极武器:reduce() 累加器
reduce 是功能最强大的遍历方法,它能将数组“折叠”成一个单一的值(数字、对象、甚至新数组)。
1. 语法参数
reduce((sum, cur, index, arr) => { ... }, initialValue)
- initialValue(可选) :建议始终提供初始值。如果不提供,
sum默认取数组第一项,遍历从索引 1 开始;若数组为空且无初始值,会报错。
2. 实战演练
const arr = [1, 2, 3, 4, 5];
const total = arr.reduce((sum, item) => sum + item, 10000);
console.log(total); // 10015
五、 面试模拟题(高频考点)
Q1:forEach、map、filter 的区别是什么?
参考回答:
-
forEach:用于执行副作用(如打印、修改外部变量),无返回值。
-
map:用于对原数据进行加工,返回等长的新数组。
-
filter:用于数据清洗,返回符合条件的新数组(长度可能变短)。
它们三者都不会改变原数组。
Q2:在一个非常大的数组中寻找一个特定元素,find 和 filter 哪个性能更好?
参考回答:
find 性能更好。因为 find 在找到第一个匹配项后就会停止遍历(短路效应),而 filter 必须遍历完整个数组来找出所有符合条件的项。
Q3:如果 reduce 没有提供初始值 initialValue,会发生什么?
参考回答:
- 如果数组不为空:
accumulator(累加器)将取数组的第一个元素,currentValue将取第二个元素,遍历从索引 1 开始。 - 如果数组为空:直接抛出
TypeError。为了代码健壮性,通常建议手动设置初始值。
六、 总结表
| 方法 | 返回值 | 是否改变原数组 | 场景 |
|---|---|---|---|
| forEach | undefined | ❌ | 简单遍历 |
| map | 新数组 | ❌ | 数据加工 |
| filter | 新数组 | ❌ | 数据筛选 |
| some/every | Boolean | ❌ | 条件校验 |
| find | 成员值 | ❌ | 查找单个值 |
| reduce | 累加结果 | ❌ | 数据聚合/折叠 |