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