亚洲日本永久一区二区_国产精品k频道网址导航_首页aⅴ色老汉中文字幕_免费深夜全片观看_9久久9毛片又大又硬又粗_国产精品成亚洲电影_日韩不用播放器的av_欧美特色特黄视频

JavaScript 中的 .forEach() 和 for...of

JavaScript 中的 .forEach() 和 for...of

.forEach() 方法被認(rèn)為是 JavaScript 中的高階函數(shù),其工作方式是為列表中的每個元素傳入當(dāng)前元素、索引和列表(正在循環(huán)的整個數(shù)組),用更專業(yè)的術(shù)語來說就是對于迭代器的每次調(diào)用,函數(shù)都會接收三個參數(shù)(元素、索引、列表)調(diào)用。如果列表是 JavaScript 對象,則迭代器參數(shù)將是 (valuekeylist),在《淺談Javascript中的forEach和map之間的區(qū)別》中介紹了一次。在現(xiàn)代前端開發(fā)中,通常 .forEach() 方法可以替代過去的 for ,而對于不需要訪問索引的遍歷則建議使用 for...of ,因為它的遍歷效率比 .forEach() 快。

語法

arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

  • callback:為數(shù)組中每個元素執(zhí)行的函數(shù),該函數(shù)接收一至三個參數(shù):
    • currentValue:數(shù)組中正在處理的當(dāng)前元素。
    • index:可選,數(shù)組中正在處理的當(dāng)前元素的索引。
    • array:可選,forEach() 方法正在操作的數(shù)組。

使用方法如下代碼:

const arrayMonths = ["一月", "二月", "三月"];
arrayMonths.forEach((value, index, list) => {
    console.log(value); // 一月,二月,三月
    console.log(index); // 0,1,1
    console.log(list); // [ '一月', '二月', '三月' ],[ '一月', '二月', '三月' ],[ '一月', '二月', '三月' ]
});

說到 .forEach() ,就有必要提一下 for...of ,一個 ES6 中也引入用于迭代列表的方法。

for (variable of iterable) {
    //statements
}
  • variable:在每次迭代中,將不同屬性的值分配給變量。
  • iterable:被迭代枚舉其屬性的對象。
const arrayMonths = ["一月", "二月", "三月"];
for (const month of arrayMonths) {
    console.log(month); // 一月,二月,三月
}

.forEach() 與 for...of

.forEach() 函數(shù)在數(shù)組上循環(huán)并在每次迭代中執(zhí)行回調(diào)函數(shù),使用 .forEach() 方法和使用 for...of 之間沒有功能區(qū)別。.forEach() 的一個好處是可以訪問索引,而 for...of不會訪問索引。

for...of 支持循環(huán)體中的各種控制流,如 continuebreakyieldawait

在效率上,for...of.forEach() 快。

在代碼組織上,如果 for...of 中代碼量很大的時候,維護起來會非常麻煩,循環(huán)中的代碼也與它緊密耦合,降低了它的可重用性。

當(dāng)使用 .forEach() 循環(huán)時,可以像下面這樣組織代碼:

const arrayMonths = ["一月", "二月", "三月"];

function printValue(value) {
    console.log(value);
}

arrayMonths.forEach(printValue);

通常有人會問如何中止 .forEach()

默認(rèn)情況下,是無法取消 .forEach() 循環(huán)。但是,可以使用的一種方法是放置一個“假”循環(huán)中斷——也就是說,在邏輯周圍放置一個條件,以便僅在條件匹配時才執(zhí)行。

const arrayMonths = ["一月", "二月", "三月"];

function printValue(value) {
    if (value === "二月") {
        console.log(value);
    }
}

arrayMonths.forEach(printValue);

上面的代碼片段只是一種循環(huán)中斷的假象,在這種情況下就需要使用 .find().filter().findIndex() 來替代。