循環的問題
迭代器
????迭代器是被設計專用于迭代的對象,帶有特定接口。所有的迭代器對象都擁有 next() 方法,會返回一個結果對象。該結果對象有兩個屬性:對應下一個值的 value ,以及一個布爾類型的 done ,其值為 true 時表示沒有更多值可供使用。迭代器持有一個指向集合位置的內部指針,每當調用了 next() 方法,迭代器就會返回相應的下一個值。
生成器
????生成器( generator )是能返回一個迭代器的函數。生成器函數由放在 function 關鍵字之后的一個星號( * )來表示,并能使用新的 yield 關鍵字。將星號緊跟在 function 關鍵字之后,或是在中間留出空格,都是沒問題的。
? ? 生成器在每次運行到yield后面都會停止運行,直到下一次調用迭代器的next()方法,然后再繼續運行。
???yield關鍵字也可以和表達式一起使用。?yield 關鍵字只能用在生成器內部,用于其他任意位置都是語法錯誤,即使在生成器內部的函數中也不行。
生成器函數表達式
? ? 不能將箭頭函數作為生成器。
生成器對象方法
可迭代對象與 for-of 循環
????可迭代對象( iterable )是包含 Symbol.iterator 屬性的對象。這個 Symbol.iterator 知名符號定義了為指定對象返回迭代器的函數。在 ES6 中,所有的集合對象(數組、 Set 與 Map )以及字符串都是可迭代對象,因此它們都被指定了默認的迭代器。可迭代對象被設計用于與 ES 新增的 for-of 循環配合使用。
訪問默認迭代器
檢測對象是否能進行迭代。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" );
異步任務運行
異步任務運行器