抛弃 forEach,让数组遍历更高效

forEach 方法因其简洁易读的语法成为了我们处理数组的首选。然而,随着性能要求的提高和更多数组方法的出现,是时候重新评估我们的数组遍历策略了。

forEach 的局限性

forEach 方法虽然直观,但存在几个明显的缺点:

  • 性能较差:在大数组上,forEach 的执行速度通常比传统的 for 循环慢
  • 无法中断:一旦开始,必须遍历完整个数组,不支持 break 或 return 提前退出
  • 不支持异步:无法优雅地处理异步操作
  • 返回值问题:始终返回 undefined,无法链式操作

更高效的替代方案

经典 for 循环

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

for…of 循环 

for...of 提供了几乎与 forEach 相同的简洁语法,同时保留了使用 breakcontinue 和 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` 等)。

posted @ 2025-03-01 22:42  李小菜丶  阅读(34)  评论(0)    收藏  举报