目录

  • 定义
  • 语法
  • 使用
    • Generator.prototype.next()
    • Generator.prototype.return()
    • Generator.prototype.throw()
  • 使用场景

定义

生成器对象是由一个 generator function 返回的,并且它符合可迭代协议和迭代器协议。

语法

function* gen() {yield 1;yield 2;
}let g = gen();
// "Generator { }"

使用

Generator通过 next() return()throw() 三个方法返回对应值。

Generator.prototype.next()

next() 方法返回一个包含属性 done 和 value 的对象。该方法也可以通过接受一个参数用以向生成器传值。

语法:gen.next(value)

参数:value:向生成器传值

返回值:返回的对象包含两个属性:

  • done (布尔类型) - 如果迭代器超过迭代序列的末尾,则值为 true。 在这种情况下,value 可选地指定迭代器的返回值。
    如果迭代器能够生成序列中的下一个值,则值为 false。 这相当于没有完全指定 done 属性。
  • value - 迭代器返回的任意的 JavaScript 值。当 done 的值为 true 时可以忽略该值。

示例:

function* gen() {let value = yield;yield 1;yield 2;
}let g = gen(); // "Generator { }"
g.next();      // "Object { value: 1, done: false }"
g.next();      // "Object { value: 2, done: false }"
g.next();      // "Object { value: undefined, done: true }"

向生成器传值,使用值调用 next,注意因为生成器最初没有产生任何结果,所以第一次调用没有记录任何内容。

function* gen() {while(true) {var value = yield null;console.log(value);}
}let g = gen();
g.next(1);
// "{ value: null, done: false }"
g.next(2);
// 2
// "{ value: null, done: false }"

Generator.prototype.return()

return() 方法返回给定的值并结束生成器。

语法:gen.return(value)

参数:value:需要返回的值。

返回值:返回该函数参数中给定的值。

示例:

function* gen() {yield 1;yield 2;
}let g = gen();
g.next();        // { value: 1, done: false }
g.return("stop"); // { value: "stop", done: true }
g.next();        // { value: undefined, done: true },return后再调用next时value已经undefined,因为生成器已结束。

如果对已经处于“完成”状态的生成器调用return(value),则生成器将保持在“完成”状态。如果没有提供参数,则返回对象的value属性与示例最后的.next()方法相同。如果提供了参数,则参数将被设置为返回对象的value属性的值。

function* gen() {yield 1;
}var g = gen();
g.next(); // { value: 1, done: false }
g.next(); // { value: undefined, done: true }
g.return(); // { value: undefined, done: true }
g.return("done"); // { value: "done", done: true }

Generator.prototype.throw()

throw() 方法用来向生成器抛出异常,并恢复生成器的执行,返回带有 done 及 value 两个属性的对象。

语法:gen.throw(exception)

参数:exception:用于抛出的异常。

返回值:返回的对象包含两个属性:

  • done (布尔类型) - 如果迭代器超过迭代序列的末尾,则值为 true。 在这种情况下,value 可选地指定迭代器的返回值。
    如果迭代器能够生成序列中的下一个值,则值为 false。 这相当于没有完全指定 done 属性。
  • value - 迭代器返回的任意的 JavaScript 值。当 done 的值为 true 时可以忽略该值。

示例:
在生成器中使用 throw 方法向该生成器抛出一个异常,该异常通常可以通过 try…catch 块进行捕获。

function* gen() {while(true) {try {yield 1;} catch(e) {console.log("Error caught!");}}
}let g = gen();
g.next(); // { value: 1, done: false }
g.throw(new Error("Something went wrong")); // "Error caught!"

使用场景

实现 Iterator,为不具备 Iterator 接口的对象提供遍历方法。

示例:{} 原生对象是不具备 Iterator 接口无法通过 for… of遍历。用 Generator 函数为其添加 Iterator 接口,使之可以遍历。

function* objectEntries(obj) {const propKeys = Reflect.ownKeys(obj);for (const propKey of propKeys) {yield [propKey, obj[propKey]];}
}const myName = { first: 'Bob', last: 'CP' };
for (const [key,value] of objectEntries(myName)) {console.log(`${key}: ${value}`);
}
// first: Bob
// last: CP

参考:
1.《Generator - JavaScript | MDN》;
2.《5.2 ES6 Generator 函数 | 菜鸟教程》;

JavaScript 生成器Generator相关推荐

  1. JavaScript生成器函数(generator function)

    JavaScript生成器函数(generator function) 注意:数组推导式和生成器推导式建议都不要使用.都是非标准语法. 可以使用生成器函数(generator function) 语法 ...

  2. [译] 什么是 JavaScript 生成器?如何使用生成器?

    原文地址:What are JavaScript Generators and how to use them 原文作者:Vladislav Stepanov 译文出自:掘金翻译计划 本文永久链接:g ...

  3. ES6中的迭代器(Iterator)和生成器(Generator)

    用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...

  4. 生成器 Generator

    ES6生成器(Generator) 目录 ES6生成器(Generator) 什么是生成器(Generator)? 基本操作 斐波那契数列 其他操作 对象中的Generator函数 什么是生成器(Ge ...

  5. JavaScript 生成器函数

    JavaScript 生成器函数是一种特殊的函数,它可以返回一个迭代器.使用生成器函数,可以在函数执行期间暂停并返回一个值,并在之后继续执行函数. 使用生成器函数时,需要在函数名前面加上一个星号 (* ...

  6. 生成器generator

    生成器generator 定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 代码: def cash_out(a ...

  7. python3.x中的生成器generator调用next方法

    python3.x中的生成器generator调用next方法 标签: 编辑 删除 今天写了一段Python程序,用到了Python的generator.当我用到generator的next方法时,s ...

  8. python生成斐波那契_python学习-生成器(generator)及斐波那契;yield

    生成器(generator):生成器不同于列表,是根据某一种算法来推算,在循环过程中不断计算出后续的元素,从而节省大量空间. generator的创建方式有很多种. 第一种和列表创建方式相类似,只要将 ...

  9. python之路day14--列表生成式、生成器generator、生成器并行

    列表生成式 列表生成式阅读量: 44 现在有个需求,现有列表a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 二逼青年版 ...

最新文章

  1. initrd映像文档的作用和制作
  2. SqlSelect-在查询结果前面加一列序号列
  3. 浅谈对Fragment的认识
  4. Leetcode 59. 螺旋矩阵 II (每日一题 20210926)
  5. 基于FPGA的AM信号调制与解调详细步骤
  6. 阿里云Spark Shuffle的优化
  7. ComponentName的意思
  8. python post有随机字符串_Python 中的POST/GET包构建以及随机字符串的生成
  9. OpenShift 4 - 运行Spark和Zeppelin大数据应用
  10. 微课系列(6):Python关键字else的三种用法
  11. 事务回滚什么意思 try_Spring事务管理(一)快速入门
  12. oracle 转储 mysql_Oracle中DUMP的转储方法
  13. OSPFv3中LSA详解(七)——Type4类LSA详解
  14. 微搭自定义组件库开发环境搭建教程
  15. 某个程序员的工作记录
  16. 360发起网民隐私保卫战
  17. Pr 入门教程之如何创建新序列?
  18. Navigating to current location (/user) is not allowed
  19. 洛谷 P4379 [USACO18OPEN]Lemonade Line
  20. JAVA的AWT组件概述

热门文章

  1. Linux 下Apache(httpd) 安装、配置
  2. 1ppi等于多少dpi_史上最全UI相关尺寸单位详解 | px、pt、dp、sp、rem、vwvh、rpx、ppi、dpi、dppx...
  3. RAW图像处理软件 Capture One Pro 22Mac版
  4. Nexus Repository Manager OSS 3.x 安装配置
  5. 【C语言】------ 动态内存分配
  6. Linux中 Nginx+uwsgi部署flask项目 Nginx负载均衡 反向代理
  7. 会计电算化的过程 实质上是用计算机,湖北会计电算化理论试题1
  8. 民间秘术——开运去霉顺利诸法
  9. mysql 主键作用_mysql主键有什么用?
  10. Mac M1 配置初始化 Nginx+PHP+MySQL环境