抛弃 forEach,让数组遍历更高效
forEach 方法因其简洁易读的语法成为了我们处理数组的首选。然而,随着性能要求的提高和更多数组方法的出现,是时候重新评估我们的数组遍历策略了。
forEach 的局限性
forEach 方法虽然直观,但存在几个明显的缺点:
- 性能较差:在大数组上,
forEach的执行速度通常比传统的for循环慢 - 无法中断:一旦开始,必须遍历完整个数组,不支持
break或return提前退出 - 不支持异步:无法优雅地处理异步操作
- 返回值问题:始终返回
undefined,无法链式操作
更高效的替代方案
经典 for 循环

性能至关重要的场景,传统 for 循环仍然是最快的选择,比 forEach 快约 30%。
for…of 循环

for...of 提供了几乎与 forEach 相同的简洁语法,同时保留了使用 break、continue 和 return 的能力。
map、filter 和 reduce

这些函数式方法有明确的用途,代码更具声明性,易于理解和维护。
Array.some 和 Array.every
// 检查是否至少有一个元素满足条件(找到后立即停止遍历)
const hasNegative = array.some(x => x < 0);
// 检查是否所有元素都满足条件(找到不满足的立即停止)
const allPositive = array.every(x => x > 0);
这两个方法会在满足条件时提前终止遍历,比 forEach 更高效。
[].every(Boolean)
`[].every(Boolean)` 用于检查数组中所有元素是否为真值(truthy)。`Boolean` 是一个函数,作为 `Array.prototype.every` 的回调,返回每个元素的布尔值。
const arr1 = [1, 2, 3];
const allTruthy1 = arr1.every(Boolean); // true
const arr2 = [1, 0, 3];
const allTruthy2 = arr2.every(Boolean); // false
const arr3: any[] = [];
const allTruthy3 = arr3.every(Boolean); // true (空数组被认为是 "所有元素为真" 的情况)
说明
- 返回值:`true` 如果所有元素都为真值,`false` 否则。
- 空数组:对空数组调用 `every` 返回 `true`,因为没有任何元素不满足条件。
这种用法常用于快速检查数组中的元素是否均为有效值(例如非 `null`、非 `undefined`、非 `0`、非 `false` 等)。

浙公网安备 33010602011771号