Javascript有哪些遍历数组的方法?哪些不支持中断?那些不支持异步遍历?
|
zhenglin
2025年12月2日 11:43
本文热度 331
|
JavaScript 提供了多种遍历数组的方式,主要分为循环结构和数组迭代方法。
常见方法列表:
for 循环 (基础循环)
for...of (ES6,推荐)
forEach
map
filter
some
every
reduce / reduceRight
find / findIndex
他们有什么不同呢?
想象你是一个包工头,你手底下有一排工人(这就是数组 Array),你需要给他们派活儿。
JavaScript 提供了好多不同的“管理模式”来遍历这些工人,咱们来看看它们各自的性格:
1. 遍历数组的“管理模式”大赏
👴 for 循环 & for...of —— “亲力亲为的老老板”
这是最传统、最听话的模式。
特点:你指哪打哪。你可以随时喊停(break),也可以跳过某个人(continue)。
for...of (推荐) :是 ES6 新来的帅气经理,语法简洁,专门用来遍历“可迭代”的东西(数组、字符串等)。
场景:你需要绝对的控制权,或者需要按顺序一个个盯着做。
🤖 forEach —— “一根筋的监工”
特点:一旦启动,绝不回头。他会逼着每个工人都干一遍活,不管你中途是不是想停下来,他都听不见。
缺点:不能中断! 哪怕你找到想要的了,他也得把剩下的人过一遍。
场景:只是简单地让每个人干点事(比如打印一下日志),不需要返回值,也不需要中途退出。
🏭 map —— “加工流水线”
特点:进一出一。进去 10 个原料,出来 10 个成品。它不会修改原来的工人,而是生成一个新的数组(成品堆)。
场景:你需要把数据“变身”。比如把 [1, 2, 3] 变成 [2, 4, 6]。
🕵️ filter —— “面试官 / 筛选器”
🎯 find —— “寻宝猎人”
🍬 reduce —— “收纳大师 / 揉面团”
2. 灵魂拷问一:谁能按“暂停键”?(中断)
想象一下,你正在在一堆石头里找金子。
✅ 能暂停 (break / return) :
❌ 不能暂停 (必须跑完全程) :
3. 灵魂拷问二:谁能搞定“拖延症”?(异步 Async/Await)
想象每个工人干活都需要时间(比如去服务器拿数据,需要等 1 秒)。
✅ for...of —— “守秩序的排队者”
// 就像排队结账,一个结束下一个上
for (const item of list) {
await doSomething(item); // ✅ 真的会等!
}
❌ forEach —— “乱成一锅粥”
// ❌ 错误示范
list.forEach(async (item) => {
await doSomething(item); // 😱 forEach 根本不理你,直接跑下一个去了
});
map + Promise.all —— “并发大神”
// 大家一起上!
await Promise.all(list.map(async item => {
await doSomething(item);
}));
总结一下(新手小抄):
只是想遍历,或者需要 break 👉 用 for...of (最稳)。
想把数据变个样 👉 用 map。
想过滤数据 👉 用 filter。
想找某一个 👉 用 find。
里面有 await 异步操作:
要顺序执行 👉 for...of。
要并发执行 👉 map + Promise.all。
千万别用 forEach!
速记
关于中断(break/return)的支持
支持中断(break / return)的方法:
不支持中断(无法通过 break/return 提前结束)的方法:
关于异步遍历(Async/Await)的支持
这是一个常见的坑。
支持异步等待(能按顺序 await)的方法:
不支持异步等待(无法在回调中正确 await)的方法:
forEach:它会立即启动所有回调,不会等待前一个回调的 await 完成。
map:它会返回一个 Promise 数组,需要配合 Promise.all 使用,但它是并发执行的,不是顺序执行。
filter, reduce 等高阶函数在配合 async 使用时通常无法达到预期效果(例如 filter 无法根据异步结果过滤)。
该文章在 2025/12/2 11:43:52 编辑过