国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 16:46:40
字體:
來源:轉載
供稿:網友

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

1. 簡介

① 理解:可以把它理解成一個函數的內部狀態的遍歷器,每調用一次,函數的內部狀態發生一次改變。

② 寫法:

function* f() {}

③ 作用:就是可以完全控制函數的內部狀態的變化,依次遍歷這些狀態。

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

示例:

function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending';}var hw = helloWorldGenerator();//第一次調用該方法不會執行,僅返回一個遍歷器。var a = hw.next();while(!a.done){ //當執行到return 時,a.done=true,終止循環 console.log(a.value+','+a.done); a = hw.next();}console.log(a.value+','+a.done);

結果:

hello,falseworld,falseending,true

2. next() 的參數

① 我們要知道是next()返回一個對象,yield語句本身是沒有返回值,或者說總是返回undefined。next方法可以帶一個參數,該參數就會被當作上一個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 }

結果:

{ value: 0, done: false }undefined{ value: 1, done: false }true{ value: 0, done: false }

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

②由于next方法的參數表示上一個yield語句的返回值,所以第一次使用next方法時,不能帶有參數。V8引擎直接忽略第一次使用next方法時的參數,只有從第二次使用next方法開始,參數才是有效的。

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循環可以自動遍歷Generator函數,且此時不再需要調用next方法,

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

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);}

結果:

Greetings!Hello!Bye!Ok, bye.

② yield命令后面如果不加星號,返回的是整個數組,加了星號就表示返回的是數組的遍歷器。

function* gen(){ yield* ["a", "b", "c"];}gen().next() // { value:"a", done:false }

遍歷嵌套數組:

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程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广丰县| 金秀| 白朗县| 怀安县| 弋阳县| 托克托县| 屏东县| 商河县| 广西| 福鼎市| 云阳县| 广汉市| 汕尾市| 渑池县| 汕头市| 塔河县| 扎赉特旗| 巨鹿县| 上杭县| 泗阳县| 怀仁县| 韩城市| 太康县| 峨边| 沾化县| 石城县| 沧源| 鹰潭市| 宝清县| 二手房| 胶州市| 海伦市| 延寿县| 客服| 思茅市| 嘉义县| 青浦区| 分宜县| 卫辉市| 江北区| 镶黄旗|