生成器——迭代器工作的工厂
生活随笔
收集整理的這篇文章主要介紹了
生成器——迭代器工作的工厂
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.生成器的概念
1)定義:生成器是一個通過構造函數Generator創建的對象,生成器既是一個迭代器,同時又是一個迭代對象。
2)生成器的創建:我們并不能new一個生成器,而是由生成器函數(Generator Function)來創建生成器
3)生成器的書寫:function* method() {},該函數返回一個生成器,即調用生成器函數后,得到一個生成器。
【例1】
function* test() {} const generator = test();【結果】
?
2.生成器函數的內部執行
生成器函數內部是為了給生成器的每次迭代提供數據的,每次調用生成器的next方法,將導致生成器函數運行到下一個yield關鍵字位置。yield只能在生成器函數內部使用,來表示”產生“一個迭代數據.
【例2】
function* test() {console.log("第一次運行");yield 1;console.log("第二次運行");yield 2;console.log("第三次運行"); } const generator = test();【結果】可以看到在第一次調用next方法后,生成器函數運行到yield 1;停止了,再次調用又運行到下一個yield位置。
【例3】
const arr1 = [1, 4, 3, 6, 5]; const arr2 = [3, 5, 2, 7, 5, 4]; function* creatInerator(arr) {//生成器調用next函數,運行生成器構造函數,進入forof循環for (const iterator of arr) {//調用一次next,代碼運行到yield停止yield iterator;} } const iter1 = creatInerator(arr1); const iter2 = creatInerator(arr2);【結果】
【注】
1)生成器函數可以有返回值,返回值出現在第一次done為true時的value屬性中
【例4】
function* test() {console.log("第一次運行");yield 1;console.log("第二次運行");yield 2;console.log("第三次運行");return 10; } const generator = test();【結果】
2)調用生成器的next方法時,可以傳遞參數,傳遞的參數會交給yield表達式的返回值
3)第一次調用next方法時,傳參沒有任何意義
【例5】
function* test() {console.log("start");let info = yield 1;console.log(info);info = yield 2 + info;console.log(info); } const generator = test();【結果】
?
4)在生成器函數內部,可以調用其他生成器函數,但是要注意加上*號
【例6】
function* t1() {yield 'a';yield 'b'; } function* test() {//相當于把生成器t1中的函數體復制到test中yield* t1();yield 1;yield 2;yield 3; } const generator = test();【結果】
?
3.生成器的其他API
1)return方法:調用該方法,可以提前結束生成器函數,從而提前讓整個迭代過程結束
2)throw方法:調用該方法,可以在生成器中產生一個錯誤
總結
以上是生活随笔為你收集整理的生成器——迭代器工作的工厂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可迭代协议与for-of循环
- 下一篇: set,存放不重复数据的集合类型