当前位置:首页 > 日记 > 正文

ES6新特性三: Generator | 生成器函数详解

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,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程序设计有所帮助。

相关文章

word2007设置密码保护的两种方法

word2007设置密码保护的两种方法

设置,方法,密码保护,两种,电脑软件,  对于自己重要的word文档,肯定是需要加密保护更好。那么,对于word2007,怎么设置密码保护呢?那么下面就由小编给大家分享下word2007的技巧,希望能帮助到您。设置密码保护方法一:  步骤一:首先,我们先打开我…

PPT2010转换为视频的方法是什么

PPT2010转换为视频的方法是什么

方法,转换为,视频,电脑软件,  随着PPT制作越来越精美化、动感化和多媒体化,人们自然希望能把它完美转化成视频,发给客户自行观看、放在网页播放或者在DVD里播放。以下是小编为您带来的关于PPT2010转换为视频的方法,希望对您有所帮助。PPT201…

excel if函数等于条件的筛选方法ex

excel if函数等于条件的筛选方法ex

函数,条件,筛选,方法,电脑软件,  在Excel中,IF函数最为常用,IF函数可以帮用户筛选出合适的数据进行显示,现在请欣赏小编带来的excel if函数等于条件的筛选方法。希望对你有帮助!excel if函数等于条件的筛选方法&middot;在EXCEL2003中 函数 IF…

2007版ppt怎么将转换为格式

2007版ppt怎么将转换为格式

方法,图片格式,转换为,转成,格式,  如何将ppt2007转换成图片格式呢?其实PPT里面有个另存为选项,对于新手来说熟练运用ppt还是有一定难度,怎么办?下面小编就为你提供ppt2007如何转成图片格式的方法,欢迎大家来到学习ppt使用技巧。ppt2007转成…

在Word2007文档中如何制作英文格式

在Word2007文档中如何制作英文格式

文档,英文,格式,电脑软件,  如果用户需要给国外的亲朋好友写信,可以使用Word2007提供的信封制作功能制作标准格式的英文信封,编辑好文档后就可以直接发送了。以下是小编为您带来的关于在Word2007文档中制作英文格式信封,希望对您有所帮助。…

VueJS如何引入css或者less文件的一

VueJS如何引入css或者less文件的一

文件,电脑软件,VueJS,css,我们在做Vue+webpack的时,难免会引入各种公共css样式文件,那么我们改如何引入呢?引入时会有那些坑呢?首先,引入公共样式时,我们在“main.js”里使用AMD的方式引入,即require('./assets/css/main.less');这时,我们会抛出…

word如何将文字转换成word将文字转

word如何将文字转换成word将文字转

文字,方法,转换成,如何将,图片,  在使用word的时候有一个非常有有趣的功能,就是能将文字变成图片,例如,你要将文字猫变成图片猫,然后文章中所有的文字猫都变成了图片猫,是不是觉得像变魔术一样很神奇,那就跟我来学习吧。word将文字转换成图片的…

浅谈jQuery框架Ajax常用选项

浅谈jQuery框架Ajax常用选项

选项,框架,浅谈,常用,电脑软件,json(JavaScript Object Notation):轻量级的数据交换(交换的数据转换成与平台无关的)格式java对象转换成json字符串,使用ObjectMapper类的writeValueAsString(java对象);将json字符串或者json对象组成的数组…

qq安全中心申诉进度教程

qq安全中心申诉进度教程

安全中心,教程,方法,进度,电脑软件,  我提交了QQ申诉申请,我怎么知道申诉进度怎么样呢?怎么查询呢?还有如果我申诉成功了接来该怎么做呢?今天小编给你分享一下,欢迎阅读。qq安全中心申诉进度的方法由于提交申诉后你的QQ无法登录了,因此需…

AI教怎么给风景立方体添加阴影效果

AI教怎么给风景立方体添加阴影效果

阴影效果,风景,立方体,电脑软件,AI,上一节,我们已经讲解了如何制作一个风景立方体,为了让其看起来更加的真实,我们可能会想到让其添加一个倒影,阴影的效果,让其看起来类似与悬浮于空中,那这个投影又该怎么制作呢?软件名称:Adobe Illustrator CS6 (A…

写给vue新手们的vue渲染页面教程

写给vue新手们的vue渲染页面教程

教程,新手,页面,电脑软件,vue,前言本文主要给各位vue的新手们分享了关于vue渲染页面的教程,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。vue渲染页面路径图index.htmlApp.vuerouter.jsmain.js效果图:总结以上就是这篇文章…

PPT2013怎么设置自动显示当前页码

PPT2013怎么设置自动显示当前页码

显示,方法,页码,设置自动,电脑软件,  PPT中添加页码时会遇到一系列问题,例如怎么可以让图片的页码变成:1/50,这样的。大概的就是说,我共有50张幻灯片,现在放的是第1张。我只可以做到加成第一个,就是有个页脚1.但做不到可以显示总共的也在里面。…