JavaScript -- ES6 迭代器和生成器

使用迭代器的目的:更高效的操作數據。使用迭代器可以使訪問數據和操作數據的過程中,不需要追蹤索引

傳統的for循環:

for (let I=0; I<10; I++){
    ...
    // 訪問數據的過程中,需要追蹤索引 i 的值。並不方便且容易出錯。
}

學習了迭代器後,就會發現數據訪問會變的簡潔很多。

什麼是迭代器

迭代器是一種特殊的對象,所有的迭代器對象都有一個 next 方法,調用 next 方法會返回一個對象——該對象有兩個屬性:一個是 value,表示下一個要返回的值;一個是 done,表示是否有更多數據可以返回:當數據訪問結束,done 就會置爲 true。並且,當 done = true 的時候,value = undefined。

const iterator = createIterator([1, 2, 3])

iterator.next(); // {value: 1, done: false}
iterator.next(); // {value: 2, done: false}
iterator.next(); // {value: 3, done: false}
iterator.next(); // {value: undefined, done: true}

如何生成一個迭代器?試試生成器咯

在 ES6 中,引入了一個生成器對象,它可以讓迭代器對象生成的過程變得簡單。

// 生成器語法
function *createIterator() {
    yield 1;
    yield 2;
    yield 3;
}
const iterator = createIterator() // 與普通函數調用方法一致

iterator.next(); // {value: 1, done: false}
iterator.next(); // {value: 2, done: false}
iterator.next(); // {value: 3, done: false}
iterator.next(); // {value: undefined, done: true}

生成器函數有一個有趣的特點,每當執行完一條 yield 語句,函數就會停下來。知道再次調用迭代器的 next 方法,就會繼續執行到下一個 yield 語句。這種中止函數執行的特性讓生成器有很多有趣的應用,這些應用會在下文中涉及。

注意,yield 的使用限制:yield 關鍵字只能在生成器內部使用,在其他地方使用則會導致語法錯誤,即使是在生成器內部的函數使用也會報錯

function *createIterator(items) {
    items.forEach((item) => {
        yield item; // Wrong~ 這樣會報錯的哦!
    })
}

生成器的函數表達式寫法

(待續)

發佈了344 篇原創文章 · 獲贊 39 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章