JavaScript中的迭代器

在軟件開發領域,“迭代”的意思是按照順序反覆多次執行一段程序,通常會有明確的終止條件。 ECMAScript 6規範新增了兩個高級特性:迭代器和生成器。
在 JavaScript 中,計數循環就是一種最簡單的迭代:

for (let i = 1; i <= 10; ++i) {
console.log(i);
}

循環是迭代機制的基礎,這是因爲它可以指定迭代的次數,以及每次迭代要執行什麼操作.迭代會在一個有序集合上進行。數組是 JavaScript 中有序集合的最典型例子。
迭代器模型
迭代器模式(特別是在 ECMAScript 這個語境下)描述了一個方案,即可以把有些結構稱爲“可迭代對象”( iterable),因爲它們實現了正式的 Iterable 接口,而且可以通過迭代器 Iterator 消費。可迭代對象是一種抽象的說法。基本上,可以把可迭代對象理解成數組或集合這樣的集合類型的對象。它們包含的元素都是有限的,而且都具有無歧義的遍歷順序:
生成器
生成器是 ECMAScript 6 新增的一個極爲靈活的結構,擁有在一個函數塊內暫停和恢復代碼執行的
能力。這種新能力具有深遠的影響,比如,使用生成器可以自定義迭代器和實現協程




生成器的形式是一個函數,函數名稱前面加一個星號( *)表示它是一個生成器。只要是可以定義函數的地方,就可以定義生成器。

// 生成器函數聲明
        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 關鍵字可以將跟在它後面的可迭代對象序列化爲一連串值。
image
最新2020整理收集的一些高頻面試題(都整理成文檔),有很多幹貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,需要獲取這些內容的朋友請加Q君樣:909038429
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章