最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript forEach 按數(shù)組順序執(zhí)行的三個(gè)維度分析

 更新時(shí)間:2026年01月10日 09:35:05   作者:亮子AI  
文章分析了JavaScript中forEach在同步和異步代碼中的行為,指出它在異步情況下不會(huì)按順序等待任務(wù)完成,這是常見(jiàn)的陷阱,文章還介紹了幾種替代forEach處理異步任務(wù)的方法,推薦使用for...of和reduce,以及在需要并發(fā)時(shí)使用map和Promise.all,感興趣的朋友跟隨小編一起看看吧

簡(jiǎn)單直接的回答是:是的,在同步代碼中,forEach 是嚴(yán)格按照數(shù)組索引順序(從 0 到 length-1)執(zhí)行的。

但這里有一個(gè)巨大的陷阱:雖然它按順序“啟動(dòng)”任務(wù),但它不會(huì)等待異步操作(如 Promise)完成。

下面從三個(gè)維度詳細(xì)分析:

1. 同步代碼:嚴(yán)格順序執(zhí)行

如果你在 forEach 中執(zhí)行的是純同步邏輯,它會(huì)從頭到尾依次執(zhí)行:

const arr = [1, 2, 3];
arr.forEach(num => {
  console.log(num);
});
// 輸出順序永遠(yuǎn)是: 1, 2, 3

2. 異步代碼:順序啟動(dòng),但不順序等待(最常見(jiàn)的坑)

當(dāng)你把 async/await 放在 forEach 中時(shí),forEach 不會(huì)等待上一個(gè)循環(huán)的任務(wù)完成才開(kāi)始下一個(gè)。

const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const arr = [1, 2, 3];
async function test() {
  console.log('開(kāi)始');
  arr.forEach(async (num) => {
    await delay(1000 / num); // 不同的延遲時(shí)間
    console.log(num);
  });
  console.log('結(jié)束');
}
test();
// 實(shí)際輸出順序:
// 開(kāi)始
// 結(jié)束
// 3 (延時(shí)最短,先完成)
// 2
// 1 (延時(shí)最長(zhǎng),最后完成)

原因: forEach 內(nèi)部的邏輯大致是這樣的:for (let i = 0; i < len; i++) { callback(arr[i]); }。它只是簡(jiǎn)單地調(diào)用了回調(diào)函數(shù),并沒(méi)有 await 回調(diào)函數(shù)的返回值。

3. 特殊規(guī)則:跳過(guò)“稀疏”位置

forEach 會(huì)跳過(guò)數(shù)組中已刪除或未賦值的項(xiàng)(空位),但不會(huì)跳過(guò) undefined。

const arr = [1, , 3]; // 索引 1 是空位
arr.forEach((num, i) => console.log(i, num));
// 輸出:
// 0 1
// 2 3
// (跳過(guò)了索引 1)

總結(jié)與最佳實(shí)踐

如果你需要嚴(yán)格按順序執(zhí)行異步任務(wù)(即:任務(wù)1完成 -> 任務(wù)2開(kāi)始),請(qǐng)不要使用 forEach,改用以下方式:

方法 A:使用for...of(推薦)

for...of 能夠正確處理 await。

for (const num of arr) {
  await doSomethingAsync(num); // 這里會(huì)嚴(yán)格等待
}

方法 B:使用reduce

arr.reduce(async (promise, num) => {
  await promise;
  await doSomethingAsync(num);
}, Promise.resolve());

方法 C:如果你不需要順序,只需要并發(fā)

如果你希望所有任務(wù)同時(shí)開(kāi)始并等待全部結(jié)束,使用 map 配合 Promise.all

await Promise.all(arr.map(async (num) => {
  await doSomethingAsync(num);
}));

結(jié)論: 在處理同步邏輯時(shí),forEach 是順序的;在處理 async/await 異步邏輯時(shí),它會(huì)導(dǎo)致“并發(fā)”執(zhí)行(實(shí)際上是順序啟動(dòng),亂序結(jié)束),這通常不是你想要的結(jié)果。

到此這篇關(guān)于JavaScript forEach 按數(shù)組順序執(zhí)行的三個(gè)維度分析的文章就介紹到這了,更多相關(guān)js foreach數(shù)組順序執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中的事件循環(huán)機(jī)制解讀

    JavaScript中的事件循環(huán)機(jī)制解讀

    本文全面介紹了JavaScript的事件循環(huán)機(jī)制,包括其基本概念、組成部分、任務(wù)隊(duì)列的詳細(xì)解釋、完整的執(zhí)行流程、實(shí)際代碼演示、瀏覽器與Node.js的區(qū)別、常見(jiàn)面試題分析以及性能優(yōu)化技巧,通過(guò)記憶口訣“同微宏,微先走,宏之后,微清空”,幫助讀者更好地理解和應(yīng)用事件循環(huán)機(jī)制
    2025-10-10
  • echarts餅圖指示器文字顏色設(shè)置不同實(shí)例詳解

    echarts餅圖指示器文字顏色設(shè)置不同實(shí)例詳解

    在默認(rèn)的餅狀圖里面,圖例legend顏色是黑色的,有時(shí)候根據(jù)ui需要,根據(jù)不同的背景色,需要將圖例文字調(diào)成白色或者其他顏色,下面這篇文章主要給大家介紹了關(guān)于echarts餅圖指示器文字顏色設(shè)置不同的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 如何使用JS console.log()技巧提高工作效率

    如何使用JS console.log()技巧提高工作效率

    這篇文章主要介紹了如何使用JS console.log()技巧提高工作效率,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 在Z-Blog中運(yùn)行代碼[html][/html](純JS版)

    在Z-Blog中運(yùn)行代碼[html][/html](純JS版)

    在Z-Blog中運(yùn)行代碼[html][/html](純JS版)...
    2007-03-03
  • 純js實(shí)現(xiàn)隔行變色效果

    純js實(shí)現(xiàn)隔行變色效果

    這篇文章主要為大家詳細(xì)介紹了純js實(shí)現(xiàn)隔行變色效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 跨域解決之JSONP和CORS的詳細(xì)介紹

    跨域解決之JSONP和CORS的詳細(xì)介紹

    跨域常見(jiàn)的兩種方式,分別是jsonp和cors,這篇文章主要介紹了跨域解決之JSONP和CORS的詳細(xì)介紹,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • 使用POST方式彈出窗口的兩種方法示例介紹

    使用POST方式彈出窗口的兩種方法示例介紹

    做一個(gè)功能需要彈窗,因?yàn)間et方式對(duì)url的長(zhǎng)度有限制,所以必須用post,本文有兩個(gè)不錯(cuò)的方法,大家可以參考下
    2014-01-01
  • UNIAPP實(shí)現(xiàn)微信小程序登錄授權(quán)和手機(jī)號(hào)授權(quán)功能(uniapp做微信小程序)

    UNIAPP實(shí)現(xiàn)微信小程序登錄授權(quán)和手機(jī)號(hào)授權(quán)功能(uniapp做微信小程序)

    uniapp開(kāi)發(fā)小程序,先授權(quán)用戶信息后再出現(xiàn)手機(jī)號(hào)授權(quán)的頁(yè)面進(jìn)行手機(jī)號(hào)授權(quán),完成后返回上一頁(yè)面并把信息存入后臺(tái)以及前臺(tái)緩存中,方便使用,這篇文章主要介紹了UNIAPP實(shí)現(xiàn)微信小程序登錄授權(quán)和手機(jī)號(hào)授權(quán)(uniapp做微信小程序),需要的朋友可以參考下
    2024-08-08
  • onclick與listeners的執(zhí)行先后問(wèn)題詳細(xì)解剖

    onclick與listeners的執(zhí)行先后問(wèn)題詳細(xì)解剖

    javascript中onclick與listeners的執(zhí)行先后問(wèn)題一直都是大家所疑惑的地方,接下來(lái)將為大家解決此疑惑,感興趣的朋友可以了解下哦
    2013-01-01
  • JavaScript Window 打開(kāi)新窗口(window.location.href、window.open、window.showModalDialog)

    JavaScript Window 打開(kāi)新窗口(window.location.href、windo

    本文主要介紹了JavaScript Window 打開(kāi)新窗口的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評(píng)論

剑川县| 高平市| 牡丹江市| 古田县| 西宁市| 冕宁县| 买车| 南召县| 台湾省| 盐亭县| 丰台区| 肃北| 得荣县| 旬邑县| 都昌县| 化州市| 宝应县| 巴彦淖尔市| 湾仔区| 金平| 酒泉市| 清镇市| 额济纳旗| 荃湾区| 桃江县| 公主岭市| 离岛区| 平顶山市| 洪湖市| 阿荣旗| 墨竹工卡县| 五峰| 南宁市| 旅游| 渑池县| 宝鸡市| 遵化市| 龙南县| 留坝县| 福鼎市| 新蔡县|