使用迭代器的目的:更高效的操作數據。使用迭代器可以使訪問數據和操作數據的過程中,不需要追蹤索引。
傳統的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~ 這樣會報錯的哦!
})
}
生成器的函數表達式寫法
(待續)