全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

希望本文所述对大家ECMAScript程序设计有所帮助。


# ES6  # 新特性  # Generator  # 生成器  # 函数  # 详解JavaScript ES6中的Generator  # Es6 Generator函数详细解析  # JavaScript中 ES6 generator数据类型详解  # ES6中Generator与异步操作实例分析  # 详谈ES6中的迭代器(Iterator)和生成器(Generator)  # ES6 系列之 Generator 的自动执行的方法示例  # ES6 Generator函数的应用实例分析  # ES6中的迭代器、Generator函数及Generator函数的异步操作方法  # ES6 Generator基本使用方法示例  # 遍历  # 的是  # 返回值  # 就会  # 如果没有  # 值为  # 才是  # 就有  # 把它  # 给大家  # 要知道  # 被称为  # 或者说  # 跟在  # 不加  # 所述  # 程序设计  # 已经结束  # 可以自动  # 不包含 


相关文章: 公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  广州商城建站系统开发成本与周期如何控制?  海南网站制作公司有哪些,海口网是哪家的?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  北京专业网站制作设计师招聘,北京白云观官方网站?  简单实现Android文件上传  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  如何在腾讯云免费申请建站?  如何获取PHP WAP自助建站系统源码?  如何在服务器上配置二级域名建站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  如何快速生成高效建站系统源代码?  黑客入侵网站服务器的常见手法有哪些?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何自定义建站之星模板颜色并下载新样式?  中山网站制作网页,中山新生登记系统登记流程?  如何用AWS免费套餐快速搭建高效网站?  如何用好域名打造高点击率的自主建站?  广东企业建站网站优化与SEO营销核心策略指南  如何通过虚拟机搭建网站?详细步骤解析  建站168自助建站系统:快速模板定制与SEO优化指南  建站DNS解析失败?如何正确配置域名服务器?  如何通过智能用户系统一键生成高效建站方案?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  高端企业智能建站程序:SEO优化与响应式模板定制开发  如何通过商城自助建站源码实现零基础高效建站?  如何在七牛云存储上搭建网站并设置自定义域名?  ui设计制作网站有哪些,手机UI设计网址吗?  北京制作网站的公司,北京铁路集团官方网站?  建站之星如何修改网站生成路径?  建站之星安装需要哪些步骤及注意事项?  建站之星安装后界面空白如何解决?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  如何在香港免费服务器上快速搭建网站?  无锡营销型网站制作公司,无锡网选车牌流程?  宝塔新建站点报错如何解决?  如何在建站主机中优化服务器配置?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何在云虚拟主机上快速搭建个人网站?  活动邀请函制作网站有哪些,活动邀请函文案?  建站之星3.0如何解决常见操作问题?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  网站图片在线制作软件,怎么在图片上做链接?  建站之星客服服务时间及联系方式如何?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  建站之星后台管理如何实现高效配置?  Python多线程使用规范_线程安全解析【教程】  如何彻底删除建站之星生成的Banner? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。