中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ES6中Generator函數的示例分析

發布時間:2021-07-28 10:53:51 來源:億速云 閱讀:113 作者:小新 欄目:web開發

這篇文章主要為大家展示了“ES6中Generator函數的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“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,false
world,false
ending,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

以上是“ES6中Generator函數的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

榕江县| 都昌县| 浑源县| 松桃| 东乡族自治县| 堆龙德庆县| 云梦县| 武义县| 馆陶县| 高州市| 双鸭山市| 教育| 息烽县| 清涧县| 深泽县| 会宁县| 汕头市| 黎平县| 平罗县| 南宫市| 修武县| 义马市| 仙居县| 九江县| 和林格尔县| 章丘市| 巩义市| 滨海县| 河间市| 墨脱县| 鹿邑县| 鄂伦春自治旗| 富阳市| 佛山市| 柘城县| 黄梅县| 柘荣县| 阳曲县| 二手房| 神木县| 镇沅|