ES6--(8)迭代器與生成器

循環的問題

迭代器

????迭代器是被設計專用于迭代的對象,帶有特定接口。所有的迭代器對象都擁有 next() 方法,會返回一個結果對象。該結果對象有兩個屬性:對應下一個值的 value ,以及一個布爾類型的 done ,其值為 true 時表示沒有更多值可供使用。迭代器持有一個指向集合位置的內部指針,每當調用了 next() 方法,迭代器就會返回相應的下一個值。

ES5中寫一個迭代器

生成器

????生成器( generator )是能返回一個迭代器的函數。生成器函數由放在 function 關鍵字之后的一個星號( * )來表示,并能使用新的 yield 關鍵字。將星號緊跟在 function 關鍵字之后,或是在中間留出空格,都是沒問題的。

? ? 生成器在每次運行到yield后面都會停止運行,直到下一次調用迭代器的next()方法,然后再繼續運行。

???yield關鍵字也可以和表達式一起使用。?yield 關鍵字只能用在生成器內部,用于其他任意位置都是語法錯誤,即使在生成器內部的函數中也不行。

生成器函數表達式

? ? 不能將箭頭函數作為生成器。

生成器對象方法

ES5
ES6

可迭代對象與 for-of 循環

????可迭代對象( iterable )是包含 Symbol.iterator 屬性的對象。這個 Symbol.iterator 知名符號定義了為指定對象返回迭代器的函數。在 ES6 中,所有的集合對象(數組、 Set 與 Map )以及字符串都是可迭代對象,因此它們都被指定了默認的迭代器。可迭代對象被設計用于與 ES 新增的 for-of 循環配合使用。

1? 2? 3

訪問默認迭代器

檢測對象是否能進行迭代。for-of循環在執行之前會進行相關的檢測。

創建可迭代對象

內置的迭代器

集合的迭代器

? ? ES6具有三種集成的數據類型:數組、Set和Map。三者都有如下的迭代器

????????entries() :返回一個包含鍵值對的迭代器;

????????values() :返回一個包含集合中的值的迭代器;

????????keys() :返回一個包含集合中的鍵的迭代器。

entries() 迭代器

????entries() 迭代器會在每次 next() 被調用時返回一個雙項數組,此數組代表了集合中每個元素的鍵與值

values() 迭代器

????values() 迭代器僅僅能返回存儲在集合內的值。一些瀏覽器比如谷歌,不支持數組使用values()迭代器,因為其默認的迭代器就是values(),所以直接使用數組本身。

keys() 迭代器

????keys() 迭代器能返回集合中的每一個鍵。對于數組來說,它只返回了數值類型的鍵,永不返回數組的其他自有屬性; Set 的鍵與值是相同的,因此它的 keys() 與 values() 返回了相同的迭代器;對于 Map , keys() 迭代器返回了每個不重復的鍵。

集合類型的默認迭代器

????values() 方法是數組與 Set 的默認迭代器,而 entries() 方法則是 Map 的默認迭代器。

????Map 默認迭代器的行為有助于在 for-of 循環中使用解構。

字符串的迭代器

????字符串默認迭代器能處理字符而不是碼元。

NodeList 的迭代器

????文檔對象模型( DOM )具有一種 NodeList 類型,用于表示頁面文檔中元素的集合。DOM 關于 NodeList 的規定也包含了一個默認迭代器,所以可以對NodeList 使用for-of循環。

擴展運算符...與非數組的可迭代對象

????擴展運算符...是將可迭代對象轉換為數組的最簡單方法。

迭代器高級功能

傳遞參數給迭代器

? ? 可以通過next()傳遞參數給迭代器。next()首次調用為特殊情況,所有的參數都會被忽略。next()傳遞的參數是上一次yield語句的值。

在迭代器中拋出錯誤

????迭代器可以選擇實現一個 throw() 方法,用于指示迭代器應在恢復執行時拋出一個錯誤。這是對異步編程來說很重要的一個能力,同時也會增加生成器內部的靈活度,能夠既模仿返回一個值,又模仿拋出錯誤。

????可以在生成器內部使用一個 try-catch 塊來捕捉這種錯誤。

生成器的 Return 語句

????由于生成器是函數,你可以在它內部使用 return 語句,既可以讓生成器早一點退出執行,也可以指定在 next() 方法最后一次調用時的返回值。

生成器委托

? ? 可以將兩個迭代器的值放在一起使用。可以直接在字符串上使用 yield * (例如 yield * "hello" );

異步任務運行

帶數據的任務運行

異步任務運行器

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容