ES6新特性三: Generator(生成器)函数详解
发布时间 - 2026-01-11 00:45:24 点击率:次本文实例讲述了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基本使用方法示例
# 遍历
# 的是
# 返回值
# 就会
# 如果没有
# 值为
# 才是
# 就有
# 把它
# 给大家
# 要知道
# 被称为
# 或者说
# 跟在
# 不加
# 所述
# 程序设计
# 已经结束
# 可以自动
# 不包含
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Android GridView 滑动条设置一直显示状态(推荐)
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
iOS验证手机号的正则表达式
Android仿QQ列表左滑删除操作
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何快速搭建FTP站点实现文件共享?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Python进程池调度策略_任务分发说明【指导】
Laravel如何生成URL和重定向?(路由助手函数)
使用C语言编写圣诞表白程序
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
javascript基本数据类型及类型检测常用方法小结
如何在企业微信快速生成手机电脑官网?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
历史网站制作软件,华为如何找回被删除的网站?
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Android自定义控件实现温度旋转按钮效果
进行网站优化必须要坚持的四大原则
EditPlus中的正则表达式 实战(2)
Laravel怎么上传文件_Laravel图片上传及存储配置
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何快速建站并高效导出源代码?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
网站制作软件有哪些,制图软件有哪些?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
微信小程序 canvas开发实例及注意事项
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何在IIS7中新建站点?详细步骤解析
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
微信小程序 闭包写法详细介绍
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Python制作简易注册登录系统
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
如何快速使用云服务器搭建个人网站?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
JavaScript常见的五种数组去重的方式
创业网站制作流程,创业网站可靠吗?
Laravel如何使用Collections进行数据处理?(实用方法示例)
如何用虚拟主机快速搭建网站?详细步骤解析
音乐网站服务器如何优化API响应速度?

