最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ES6新特性三: Generator(生成器)函數(shù)詳解

 更新時間:2017年04月21日 08:48:59   作者:Dason_yu  
這篇文章主要介紹了ES6新特性之Generator(生成器)函數(shù),簡單分析了Generator(生成器)函數(shù)的功能、定義、調(diào)用方法并結(jié)合實例形式給出了相關(guān)使用技巧,需要的朋友可以參考下

本文實例講述了ES6新特性三: Generator(生成器)函數(shù)。分享給大家供大家參考,具體如下:

1. 簡介

① 理解:可以把它理解成一個函數(shù)的內(nèi)部狀態(tài)的遍歷器,每調(diào)用一次,函數(shù)的內(nèi)部狀態(tài)發(fā)生一次改變。

② 寫法:

function* f() {}

③ 作用:就是可以完全控制函數(shù)的內(nèi)部狀態(tài)的變化,依次遍歷這些狀態(tài)。

④ 運行過程:當(dāng)調(diào)用Generator函數(shù)的時候,該函數(shù)并不執(zhí)行,而是返回一個遍歷器(可以理解成暫停執(zhí)行)。通過調(diào)用next()開始執(zhí)行,遇到y(tǒng)ield停止執(zhí)行,返回一個value屬性值為當(dāng)前yield語句的值,done屬性為false的對象,循環(huán)調(diào)用next(),一直執(zhí)行到return語句(如果沒有return語句,就執(zhí)行到函數(shù)結(jié)束)。next方法返回的對象的value屬性,就是緊跟在return語句后面的表達式的值(如果沒有return語句,則value屬性的值為undefined),done屬性的值true,表示遍歷已經(jīng)結(jié)束。

示例:

function* helloWorldGenerator() {
 yield 'hello';
 yield 'world';
 return 'ending';
}
var hw = helloWorldGenerator();//第一次調(diào)用該方法不會執(zhí)行,僅返回一個遍歷器。
var a = hw.next();
while(!a.done){ //當(dāng)執(zhí)行到return 時,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()返回一個對象,yield語句本身是沒有返回值,或者說總是返回undefined。next方法可以帶一個參數(shù),該參數(shù)就會被當(dāng)作上一個yield語句的返回值

function* f() {
 for(var i=0; true; i++) {
  var reset = yield i;
  console.log(reset); //打印reset,驗證yield語句是沒有返回值的
  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 }

通過next方法的參數(shù),就有辦法在Generator函數(shù)開始運行之后,繼續(xù)向函數(shù)體內(nèi)部注入值。也就是說,可以在Generator函數(shù)運行的不同階段,從外部向內(nèi)部注入不同的值,從而調(diào)整函數(shù)行為。

②由于next方法的參數(shù)表示上一個yield語句的返回值,所以第一次使用next方法時,不能帶有參數(shù)。V8引擎直接忽略第一次使用next方法時的參數(shù),只有從第二次使用next方法開始,參數(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)可以自動遍歷Generator函數(shù),且此時不再需要調(diào)用next方法,

一旦next方法的返回對象的done屬性為true,for...of循環(huán)就會中止,且不包含該返回對象

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* 語句

① 如果yield命令后面跟的是一個遍歷器,需要在yield命令后面加上星號,表明它返回的是一個遍歷器。這被稱為yield*語句。

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命令后面如果不加星號,返回的是整個數(shù)組,加了星號就表示返回的是數(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

希望本文所述對大家ECMAScript程序設(shè)計有所幫助。

相關(guān)文章

  • Uni-app跨平臺開發(fā)應(yīng)用入門實戰(zhàn)

    Uni-app跨平臺開發(fā)應(yīng)用入門實戰(zhàn)

    這篇文章主要為大家介紹了Uni-app跨平臺開發(fā)應(yīng)用入門實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Webpack的Loader和Plugin的區(qū)別

    Webpack的Loader和Plugin的區(qū)別

    這篇文章主要介紹了Webpack的Loader和Plugin的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 分頁欄的web標準實現(xiàn)

    分頁欄的web標準實現(xiàn)

    分頁欄是網(wǎng)頁上最常見不過的一個組件,本博文給出分頁欄的一個web2.0標準示例,并作簡要分析
    2011-11-11
  • JS實現(xiàn)瀏覽器狀態(tài)欄顯示時間的方法

    JS實現(xiàn)瀏覽器狀態(tài)欄顯示時間的方法

    這篇文章主要介紹了JS實現(xiàn)瀏覽器狀態(tài)欄顯示時間的方法,涉及JavaScript針對時間及狀態(tài)欄操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • JS實現(xiàn)即點即編輯功能代碼

    JS實現(xiàn)即點即編輯功能代碼

    以前在網(wǎng)上都看到過類似的功能,不過沒自己想要實現(xiàn)過,這次剛好做靜態(tài)頁面中有這樣的一個需求,就試著自己做做看,做完發(fā)現(xiàn)也不是什么很難的事情。
    2008-10-10
  • select每選擇一個option選項減少對應(yīng)的option實現(xiàn)方法

    select每選擇一個option選項減少對應(yīng)的option實現(xiàn)方法

    這篇文章主要為大家介紹了select每選擇一個option選項減少對應(yīng)的option實現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • JS Html轉(zhuǎn)義和反轉(zhuǎn)義(html編碼和解碼)的實現(xiàn)與使用方法總結(jié)

    JS Html轉(zhuǎn)義和反轉(zhuǎn)義(html編碼和解碼)的實現(xiàn)與使用方法總結(jié)

    這篇文章主要介紹了JS Html轉(zhuǎn)義和反轉(zhuǎn)義(html編碼和解碼)的實現(xiàn)與使用方法,結(jié)合實例形式總結(jié)分析了JS Html轉(zhuǎn)義和反轉(zhuǎn)義、html編碼和解碼相關(guān)封裝類定義與具體使用技巧,需要的朋友可以參考下
    2020-03-03
  • js獲取select默認選中的Option并不是當(dāng)前選中值

    js獲取select默認選中的Option并不是當(dāng)前選中值

    這篇文章主要介紹了js如何獲取select默認選中的Option并不是當(dāng)前選中的值,需要的朋友可以參考下
    2014-05-05
  • 使用javascript為網(wǎng)頁增加夜間模式

    使用javascript為網(wǎng)頁增加夜間模式

    如何給Web頁面增加夜間模式功能? 其實所謂的夜間模式就是在頁面上增加一個透明的遮罩層,但是遮罩層會擋住頁面元素, 解決方法是 添加DIV,給DIV的outline屬性一個很大的outline-width值,用outline的邊框作為遮罩,這樣既能正常點擊頁面元素,又能達到夜間模式的效果
    2014-01-01
  • javascript中checkbox使用方法簡單實例演示

    javascript中checkbox使用方法簡單實例演示

    這篇文章通過簡單的實例演示了javascript中checkbox使用方法,感興趣的小伙伴們可以參考一下
    2015-11-11

最新評論

宁海县| 桐乡市| 武宁县| 乌鲁木齐县| 志丹县| 且末县| 犍为县| 定边县| 莱州市| 张家川| 蒲江县| 承德市| 岚皋县| 保靖县| 双辽市| 浦江县| 大安市| 金昌市| 阿瓦提县| 平邑县| 松滋市| 澜沧| 含山县| 瑞金市| 积石山| 京山县| 双辽市| 平昌县| 陵川县| 吴川市| 正蓝旗| 周至县| 碌曲县| 犍为县| 琼结县| 民乐县| 福贡县| 长沙市| 西宁市| 西乌珠穆沁旗| 惠州市|