ES6新特性三: Generator(生成器)函數(shù)詳解
本文實(shí)例講述了ES6新特性三: Generator(生成器)函數(shù)。分享給大家供大家參考,具體如下:
1. 簡(jiǎn)介
① 理解:可以把它理解成一個(gè)函數(shù)的內(nèi)部狀態(tài)的遍歷器,每調(diào)用一次,函數(shù)的內(nèi)部狀態(tài)發(fā)生一次改變。
② 寫法:
function* f() {}
③ 作用:就是可以完全控制函數(shù)的內(nèi)部狀態(tài)的變化,依次遍歷這些狀態(tài)。
④ 運(yùn)行過(guò)程:當(dāng)調(diào)用Generator函數(shù)的時(shí)候,該函數(shù)并不執(zhí)行,而是返回一個(gè)遍歷器(可以理解成暫停執(zhí)行)。通過(guò)調(diào)用next()開(kāi)始執(zhí)行,遇到y(tǒng)ield停止執(zhí)行,返回一個(gè)value屬性值為當(dāng)前yield語(yǔ)句的值,done屬性為false的對(duì)象,循環(huán)調(diào)用next(),一直執(zhí)行到return語(yǔ)句(如果沒(méi)有return語(yǔ)句,就執(zhí)行到函數(shù)結(jié)束)。next方法返回的對(duì)象的value屬性,就是緊跟在return語(yǔ)句后面的表達(dá)式的值(如果沒(méi)有return語(yǔ)句,則value屬性的值為undefined),done屬性的值true,表示遍歷已經(jīng)結(jié)束。
示例:
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();//第一次調(diào)用該方法不會(huì)執(zhí)行,僅返回一個(gè)遍歷器。
var a = hw.next();
while(!a.done){ //當(dāng)執(zhí)行到return 時(shí),a.done=true,終止循環(huán)
console.log(a.value+','+a.done);
a = hw.next();
}
console.log(a.value+','+a.done);
結(jié)果:
hello,false world,false ending,true
2. next() 的參數(shù)
① 我們要知道是next()返回一個(gè)對(duì)象,yield語(yǔ)句本身是沒(méi)有返回值,或者說(shuō)總是返回undefined。next方法可以帶一個(gè)參數(shù),該參數(shù)就會(huì)被當(dāng)作上一個(gè)yield語(yǔ)句的返回值。
function* f() {
for(var i=0; true; i++) {
var reset = yield i;
console.log(reset); //打印reset,驗(yàn)證yield語(yǔ)句是沒(méi)有返回值的
if(reset) { i = -1; }
}
}
var g = f();
console.log(g.next()) // { value: 0, done: false }
console.log(g.next())// { value: 1, done: false }
console.log(g.next(true)) // { value: 0, done: false }
結(jié)果:
{ value: 0, done: false }
undefined
{ value: 1, done: false }
true
{ value: 0, done: false }
通過(guò)next方法的參數(shù),就有辦法在Generator函數(shù)開(kāi)始運(yùn)行之后,繼續(xù)向函數(shù)體內(nèi)部注入值。也就是說(shuō),可以在Generator函數(shù)運(yùn)行的不同階段,從外部向內(nèi)部注入不同的值,從而調(diào)整函數(shù)行為。
②由于next方法的參數(shù)表示上一個(gè)yield語(yǔ)句的返回值,所以第一次使用next方法時(shí),不能帶有參數(shù)。V8引擎直接忽略第一次使用next方法時(shí)的參數(shù),只有從第二次使用next方法開(kāi)始,參數(shù)才是有效的。
function* foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var it = foo(5);
console.log(it.next(3))// { value:6, done:false }
console.log(it.next(12))// { value:8, done:false }
console.log(it.next(13))// { value:42, done:true }
3. for-of 遍歷generator
for...of循環(huán)可以自動(dòng)遍歷Generator函數(shù),且此時(shí)不再需要調(diào)用next方法,
一旦next方法的返回對(duì)象的done屬性為true,for...of循環(huán)就會(huì)中止,且不包含該返回對(duì)象
function *foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6;
}
for (let v of foo()) {
console.log(v);
}
// 1 2 3 4 5
4. yield* 語(yǔ)句
① 如果yield命令后面跟的是一個(gè)遍歷器,需要在yield命令后面加上星號(hào),表明它返回的是一個(gè)遍歷器。這被稱為yield*語(yǔ)句。
let a = (function* () {
yield 'Hello!';
yield 'Bye!';
}());
let b = (function* () {
yield 'Greetings!';
yield* a;
yield 'Ok, bye.';
}());
for(let value of b) {
console.log(value);
}
結(jié)果:
Greetings! Hello! Bye! Ok, bye.
② yield命令后面如果不加星號(hào),返回的是整個(gè)數(shù)組,加了星號(hào)就表示返回的是數(shù)組的遍歷器。
function* gen(){
yield* ["a", "b", "c"];
}
gen().next() // { value:"a", done:false }
遍歷嵌套數(shù)組:
function* iterTree(tree) {
if (Array.isArray(tree)) {
for(let i=0; i < tree.length; i++) {
yield* iterTree(tree[i]);
}
} else {
yield tree;
}
}
const tree = [ 'a', ['b', 'c'], ['d', 'e'] ];
for(let x of iterTree(tree)) {
console.log(x);
}// a b c d e
希望本文所述對(duì)大家ECMAScript程序設(shè)計(jì)有所幫助。
- 詳解JavaScript ES6中的Generator
- Es6 Generator函數(shù)詳細(xì)解析
- JavaScript中 ES6 generator數(shù)據(jù)類型詳解
- ES6中Generator與異步操作實(shí)例分析
- 詳談ES6中的迭代器(Iterator)和生成器(Generator)
- ES6 系列之 Generator 的自動(dòng)執(zhí)行的方法示例
- ES6 Generator函數(shù)的應(yīng)用實(shí)例分析
- ES6中的迭代器、Generator函數(shù)及Generator函數(shù)的異步操作方法
- ES6 Generator基本使用方法示例
相關(guān)文章
Uni-app跨平臺(tái)開(kāi)發(fā)應(yīng)用入門實(shí)戰(zhàn)
這篇文章主要為大家介紹了Uni-app跨平臺(tái)開(kāi)發(fā)應(yīng)用入門實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
分頁(yè)欄的web標(biāo)準(zhǔn)實(shí)現(xiàn)
分頁(yè)欄是網(wǎng)頁(yè)上最常見(jiàn)不過(guò)的一個(gè)組件,本博文給出分頁(yè)欄的一個(gè)web2.0標(biāo)準(zhǔn)示例,并作簡(jiǎn)要分析2011-11-11
JS實(shí)現(xiàn)瀏覽器狀態(tài)欄顯示時(shí)間的方法
這篇文章主要介紹了JS實(shí)現(xiàn)瀏覽器狀態(tài)欄顯示時(shí)間的方法,涉及JavaScript針對(duì)時(shí)間及狀態(tài)欄操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
JS實(shí)現(xiàn)即點(diǎn)即編輯功能代碼
以前在網(wǎng)上都看到過(guò)類似的功能,不過(guò)沒(méi)自己想要實(shí)現(xiàn)過(guò),這次剛好做靜態(tài)頁(yè)面中有這樣的一個(gè)需求,就試著自己做做看,做完發(fā)現(xiàn)也不是什么很難的事情。2008-10-10
select每選擇一個(gè)option選項(xiàng)減少對(duì)應(yīng)的option實(shí)現(xiàn)方法
這篇文章主要為大家介紹了select每選擇一個(gè)option選項(xiàng)減少對(duì)應(yīng)的option實(shí)現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
JS Html轉(zhuǎn)義和反轉(zhuǎn)義(html編碼和解碼)的實(shí)現(xiàn)與使用方法總結(jié)
這篇文章主要介紹了JS Html轉(zhuǎn)義和反轉(zhuǎn)義(html編碼和解碼)的實(shí)現(xiàn)與使用方法,結(jié)合實(shí)例形式總結(jié)分析了JS Html轉(zhuǎn)義和反轉(zhuǎn)義、html編碼和解碼相關(guān)封裝類定義與具體使用技巧,需要的朋友可以參考下2020-03-03
js獲取select默認(rèn)選中的Option并不是當(dāng)前選中值
這篇文章主要介紹了js如何獲取select默認(rèn)選中的Option并不是當(dāng)前選中的值,需要的朋友可以參考下2014-05-05
使用javascript為網(wǎng)頁(yè)增加夜間模式
如何給Web頁(yè)面增加夜間模式功能? 其實(shí)所謂的夜間模式就是在頁(yè)面上增加一個(gè)透明的遮罩層,但是遮罩層會(huì)擋住頁(yè)面元素, 解決方法是 添加DIV,給DIV的outline屬性一個(gè)很大的outline-width值,用outline的邊框作為遮罩,這樣既能正常點(diǎn)擊頁(yè)面元素,又能達(dá)到夜間模式的效果2014-01-01
javascript中checkbox使用方法簡(jiǎn)單實(shí)例演示
這篇文章通過(guò)簡(jiǎn)單的實(shí)例演示了javascript中checkbox使用方法,感興趣的小伙伴們可以參考一下2015-11-11

