在軟件開發領域,「迭代」的意思是按照順序反覆屢次執行一段程序,一般會有明確的終止條件。 ECMAScript 6規範新增了兩個高級特性:迭代器和生成器。
for (let i = 1; i <= 10; ++i) { console.log(i); }
循環是迭代機制的基礎,這是由於它能夠指定迭代的次數,以及每次迭代要執行什麼操做.迭代會在一個有序集合上進行。數組是 JavaScript 中有序集合的最典型例子。
迭代器模式(特別是在 ECMAScript 這個語境下)描述了一個方案,便可以把有些結構稱爲「可迭代對象」( iterable),由於它們實現了正式的 Iterable 接口,並且能夠經過迭代器 Iterator 消費。可迭代對象是一種抽象的說法。基本上,能夠把可迭代對象理解成數組或集合這樣的集合類型的對象。它們包含的元素都是有限的,並且都具備無歧義的遍歷順序:
生成器是 ECMAScript 6 新增的一個極爲靈活的結構,擁有在一個函數塊內暫停和恢復代碼執行的
能力。這種新能力具備深遠的影響,好比,使用生成器能夠自定義迭代器和實現協程javascript
生成器的形式是一個函數,函數名稱前面加一個星號( *)表示它是一個生成器。只要是能夠定義函數的地方,就能夠定義生成器。
// 生成器函數聲明 function* lvhang() { } // 生成器函數表達式 let lvhang2 = function* () { } // 做爲對象字面量方法的生成器函數 let foo = { * generatorFn() {} } // 做爲類實例方法的生成器函數 class Foo { * generatorFn() {} } // 做爲類靜態方法的生成器函數 class Bar { static * generatorFn() {} }
注意 箭頭函數不能用來定義生成器函數。
調用生成器函數會產生一個生成器對象。生成器對象一開始處於暫停執行( suspended)的狀態。與迭代器類似,生成器對象也實現了 Iterator 接口,所以具備 next()方法。調用這個方法會讓生成器開始或恢復執行。
[迭代器是一個能夠由任意對象實現的接口,支持連續獲取對象產出的每個值。任何實現 Iterable
接口的對象都有一個 Symbol.iterator 屬性,這個屬性引用默認迭代器。默認迭代器就像一個迭代器
工廠,也就是一個函數,調用以後會產生一個實現 Iterator 接口的對象。
迭代器必須經過連續調用 next()方法才能連續取得值,這個方法返回一個 IteratorObject。這
個對象包含一個 done 屬性和一個 value 屬性。前者是一個布爾值,表示是否還有更多值能夠訪問;後
者包含迭代器返回的當前值。這個接口能夠經過手動反覆調用 next()方法來消費,也能夠經過原生消
費者,好比 for-of 循環來自動消費。
生成器是一種特殊的函數,調用以後會返回一個生成器對象。生成器對象實現了 Iterable 接口,
所以可用在任何消費可迭代對象的地方。生成器的獨特之處在於支持 yield 關鍵字,這個關鍵字可以
暫停執行生成器函數。使用 yield 關鍵字還能夠經過 next()方法接收輸入和產生輸出。在加上星號之
後, yield 關鍵字能夠將跟在它後面的可迭代對象序列化爲一連串值。]java