JavaScript forEach 按数组顺序执行的三个维度分析
简单直接的回答是:是的,在同步代码中,forEach 是严格按照数组索引顺序(从 0 到 length-1)执行的。
但这里有一个巨大的陷阱:虽然它按顺序“启动”任务,但它不会等待异步操作(如 Promise)完成。
下面从三个维度详细分析:
1. 同步代码:严格顺序执行
如果你在 forEach 中执行的是纯同步逻辑,它会从头到尾依次执行:
const arr = [1, 2, 3];
arr.forEach(num => {
console.log(num);
});
// 输出顺序永远是: 1, 2, 32. 异步代码:顺序启动,但不顺序等待(最常见的坑)
当你把 async/await 放在 forEach 中时,forEach 不会等待上一个循环的任务完成才开始下一个。
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const arr = [1, 2, 3];
async function test() {
console.log('开始');
arr.forEach(async (num) => {
await delay(1000 / num); // 不同的延迟时间
console.log(num);
});
console.log('结束');
}
test();
// 实际输出顺序:
// 开始
// 结束
// 3 (延时最短,先完成)
// 2
// 1 (延时最长,最后完成)原因: forEach 内部的逻辑大致是这样的:for (let i = 0; i < len; i++) { callback(arr[i]); }。它只是简单地调用了回调函数,并没有 await 回调函数的返回值。
3. 特殊规则:跳过“稀疏”位置
forEach 会跳过数组中已删除或未赋值的项(空位),但不会跳过 undefined。
const arr = [1, , 3]; // 索引 1 是空位 arr.forEach((num, i) => console.log(i, num)); // 输出: // 0 1 // 2 3 // (跳过了索引 1)
总结与最佳实践
如果你需要严格按顺序执行异步任务(即:任务1完成 -> 任务2开始),请不要使用 forEach,改用以下方式:
方法 A:使用for...of(推荐)
for...of 能够正确处理 await。
for (const num of arr) {
await doSomethingAsync(num); // 这里会严格等待
}
方法 B:使用reduce
arr.reduce(async (promise, num) => {
await promise;
await doSomethingAsync(num);
}, Promise.resolve());
方法 C:如果你不需要顺序,只需要并发
如果你希望所有任务同时开始并等待全部结束,使用 map 配合 Promise.all:
await Promise.all(arr.map(async (num) => {
await doSomethingAsync(num);
}));
结论: 在处理同步逻辑时,forEach 是顺序的;在处理 async/await 异步逻辑时,它会导致“并发”执行(实际上是顺序启动,乱序结束),这通常不是你想要的结果。
到此这篇关于JavaScript forEach 按数组顺序执行的三个维度分析的文章就介绍到这了,更多相关js foreach数组顺序执行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- JavaScript中forEach遍历数组举例详解
- javascript foreach中如何获取数组下标/index
- JS中的常见数组遍历案例详解(forEach, map, filter, sort, reduce, every)
- Javascript数组的 forEach 方法详细介绍
- js数组forEach实例用法详解
- JavaScript遍历数组的三种方法map、forEach与filter实例详解
- js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
- Javascript数组循环遍历之forEach详解
- JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
- JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
相关文章
浅析JavaScript中的平稳退化(graceful degradation)
所谓平稳退化,就是指可以让访问者在浏览器不支持javascript或者禁用了JavaScript的时候依旧可以顺利的浏览你的网页,下文给大家简单介绍了js中的平稳退化,感兴趣的朋友一起看看吧2017-07-07


最新评论