ES2015 生成器与生成器的应用场景

十、ES6 迭代器与生成器 ES6 迭代器与生成器 阅读详情

生成器

在 ECMAScript2015 中新增了一种叫做生成器的函数,英文为 Generator。引入这样一个新特性的目的就是能够在复杂的异步代码中减少回调函数嵌套所产生的的问题,从而提供更好的异步编程的解决方案。

这里先来了解一下生成器的语法结构,如下代码所示:

function* foo() {
  console.log('this is generator function.')
  return '前端课湛'
}

定义一个生成器函数的方式就是函数表达式定义函数方式的 function 关键字后面增加星号(*),这样就是一个生成器函数了。

接下来,调用这个生成器函数,并且将调用后返回的结果赋值给一个变量。如下代码所示:

const result = foo()
console.log(result)

上述代码的运行结果如下:

Object [Generator] {}

从打印的结果可以看到,生成器函数的调用并没有像普通函数一样执行函数体内部的代码,而是打印了一个生成器对象。这里如果是在 Chrome 浏览器开发者工具的控制台里面,就可以看到在这个对象的原型上也存在一个迭代器的 next() 方法。如下图所示:

然后通过返回的生成器对象调用 next() 方法,看看会得到什么样子的结果,如下所示:

this is generator function.
{ value: '前端课湛', done: true }

从打印的结果可以看到,这时生成器函数的函数体内部的代码才被执行。而且 next() 方法的返回值与迭代器的 next() 方法的返回值结构是一致的。这是因为生成器对象也实现了 Iterable 接口。

如果只是这样来使用生成器函数的话,根本就看不到生成器函数的作用。因为生成器函数在实际使用的时候一定会配合 yield 关键字使用,yield 关键字的作用与 return 有些类似,但也有不同。如下代码所示:

function* foo() {
  console.log('11111')
  yield 100
  console.log('22222')
  yield 200
  console.log('33333')
  yield 300
}

const generator = foo()

console.log(generator.next())

上述代码的运行结果如下:

11111
{ value: 100, done: false }

从打印的结果可以看到,当执行遇到第一个 yield 关键字之后,代码就没有继续执行了。接下来,再调用一次 next() 方法的结果如下:

11111
{ value: 100, done: false }
22222
{ value: 200, done: false }

从打印的结果可以看到,这次执行到第二个 yield 关键字就停止了。

通过这样的场景可以发现一些其中的特点,生成器函数会自动返回一个生成器对象,调用这个对象的 next() 方法才能让函数的函数体开始执行,在执行的过程中如果遇到了 yield 关键字时函数的执行就会被暂停。这种特性被称为叫做惰性执行。

生成器的应用场景

了解了生成器的基本用法过后,接下来看一看生成器的应用场景。

发号器应用

首先,来实现一个比较简单的应用场景 —— 发号器。在实际业务开发过程中经常会用到自增的 ID, 而且每次调用这个 ID 都需要原有的基础上加一,使用生成器来实现这样的应用是最适合不过的了。

如下代码所示:

function* createIdMaker() {
  let id = 1
  while (true) {
    yield id++
  }
}

定义一个生成器函数,在这个函数的函数体内部定义一个 id 变量用来存储 ID,通过 while 循环来生成 ID,每次生成之后再将 ID 累加。

需要注意的是,这里不需要担心死循环的问题。因为函数的函数体在执行代码时,遇到 yield 关键字就会暂停。

实现 iterator 方法

还可以使用生成器来实现对象的 iterator() 方法,因为生成器也实现了 Iterable 接口,而且使用生成器实现 iterator() 方法要比之前的方法简单很多。

如下代码所示:

const todos = {
  life: ['吃饭', '睡觉', '打豆豆'],
  learn: ['语文', '数学', '外语'],
  work: ['喝茶'],

  [Symbol.iterator]: function* () {
    const all = [].concat(this.life, this.learn, this.work)
    for (const item of all) {
      yield item
    }
  }
}

使用生成器函数实现 iterator() 方法相比于之前的代码改变有几处:

  1. 将 iterator() 方法定义为一个生成器函数
  2. 通过 for...of 循环遍历所有的可用数据
  3. 通过 yield 返回每一个被遍历到的对象
【前端】--- ES6下篇(带你深入了解ES6语法) ECMAScript。 阅读详情

相关推荐

ES6完全学习手册与实践指南.zip

ECMAScript 6(简称ES6)是JavaScript语言的一个重要更新版本,它在2015年被正式提出,并迅速成为前端开发领域的新标准。ES6引入了诸多新的语法特性,旨在让JavaScript的编程更加简洁、高效。箭头函数(Arrow Functions)是ES6中引入的一种新的函数编写方式,它提供了一种更简洁的函数书写格式。其语法为(参数1, 参数2, …, 参数N) => { 函数体 }。如果函数只包含一个参数,则圆括号可以省略;如果函数体仅包含一条返回语句,则花括号和return。

weixin_35706067的博客 424

ES2015+学习笔记系列(四)—— 生成器

目录生成器生成器函数参数生成器实例 生成器 生成器函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同 生成器对象信息 function* gen() { yield "aaa"; yield "bbb"; yield "ccc"; } let iteratorGen = gen();//返回值为一个迭代器对象 console.log(iteratorGen); console.log(iteratorGen.next()); //{value: "aaa", done: f

sinat_30491515的博客 238

光电振荡器(OEO):从原理到应用,解锁高频微波信号新纪元

本文深入解析了光电振荡器(OEO)的核心原理与前沿应用。OEO通过巧妙的光-电-光转换机制,利用光学谐振腔产生高频、高纯度、低相位噪声的微波信号,有效突破了传统电子电路的频率瓶颈。文章详细拆解了其工作流程,并探讨了在雷达系统、高速光通信及精密测量等领域的硬核应用价值。

weixin_29231027的博客 365

python生成器使用场景_python中生成器的使用

在python中我们常听到迭代器和生成器,但是本人分开来介绍,只为告诉大家迭代器和生成器不是一个东西,在上篇文章中我们详细的介绍过迭代器和可迭代对象,本章重点介绍生成器。一、生成器的应用场景对于调用一个普通的Python函数,一般是从函数的第一行代码开始执行,结束于return语句、异常或者函数所有语句执行完毕。一旦函数将控制权交还给调用者,就意味着全部结束。函数中做的所有工作以及保存在局部变量中...

weixin_39895881的博客 1373

PaddleOCR 3.x 最新版使用教程(2025)——从安装到实战身份证识别,一步到位!

本文针对PaddleOCR 3.x大版本更新带来的参数变化和兼容性问题,提供从环境配置到实际应用的全流程解决方案。

qq_58607032的博客 9787

TCN+iTransformer时间序列预测实战:从风电功率预测到源码解析(附完整代码)

本文深入探讨了TCN与iTransformer融合模型在时间序列预测,特别是风电功率预测中的应用。通过解析iTransformer‘倒置’视角的创新架构与TCN强大的局部时序捕捉能力,文章提供了完整的融合方案设计、源码实现及实战调优经验,旨在构建更强大的下一代预测引擎。

weixin_29062671的博客 265

Python生成器(Generator)的应用场景和使用(继续更新...)

这个例子中,squares是一个生成器表达式,用于生成0到9的平方。当遍历squares时,会按需计算每个平方值。在Python中使用生成器主要有两种方式:生成器函数和生成器表达式。在Python中有很多应用场景,以下是一些常见的。

ZhiYilang的博客 2159

YOLO26涨点改进| TGRS 2026 | 独家自研创新、检测头改进篇| AHATHead自适应混合注意力检测头,二次创新,强化特征表达与目标判别能力,适合遥感小目标检测、小目标检测有效涨点

🔥本文提出了一种改进YOLO26模型的AHATHead自适应混合注意力检测头,通过融合全局与局部注意力机制增强特征表达能力。该方法采用动态权重分配策略,在预测阶段自动调整关键区域与通道特征权重,有效提升小目标和密集场景的检测性能。实验表明,AHATHead在保持较高推理效率的同时,显著提高了目标定位精度与类别判别能力。文章详细介绍了模块结构、实现原理和代码集成步骤,并提供了两种改进配置方案(yolo26_AHATHead.yaml和yolo26_RFHA-YOLO-AHATHead.yaml)

Ai缝合怪、助力小伙伴高效发论文 159

python生成器使用场景_$python生成器

本文讲解一下python生成器的基本用法。生成器的使用场景当数据量很大的时候,比如从一个超大文本文件中读取内容,如果一下子把数据全部放在列表中,相当于一下子把大量数据放在了内存中,有可能造成内存溢出。那么如何解决呢?解决方案:不存储所有的数据,而是存储列表元素的生成算法(相当于递推公式),只在使用的时候再根据生成算法生成相应的元素(惰性计算),这就是生成器。创建生成器的方式把列表生成式的中括号改为...

weixin_39727336的博客 234

第81篇:Vibe Coding时代:LangGraph + Eval评估体系实战,解决 Agent 优化全靠感觉的问题

本文介绍了一个为LangGraph Coding Agent设计的评估体系解决方案。文章首先指出了当前AI Coding Agent开发中的常见问题:优化过程缺乏客观评估标准,导致改进效果难以量化。随后提出了一个完整的评估框架,包括评估指标(任务成功率、质量指标、安全指标、成本指标和流程指标)、项目结构设计和评估案例集。 核心内容包括: 设计了JSON格式的评估案例集,覆盖正常任务、边界任务和高风险场景 实现了模拟Agent输出的演示代码 构建了多维度评分系统,包括关键词匹配、禁用词检测和成本评估 提供了评

sundong_81的博客 47

基于Simulink的无迹卡尔曼滤波(UKF)SOC高精度估计仿真

本文介绍了基于Simulink的无迹卡尔曼滤波(UKF)在电池SOC高精度估计中的应用。通过无迹变换替代传统EKF的线性化过程,UKF显著提升了SOC估计精度,在强非线性工况下误差可控制在0.5%以内。文章详细阐述了UKF的核心原理,包括Sigma点生成、状态预测和观测更新等关键步骤,并基于Thevenin等效电路模型构建了完整的UKF SOC估算系统。通过Simulink建模和仿真验证,展示了UKF在大电流脉冲、变温工况等复杂场景下的优异性能,其动态响应时间小于30ms,长期累积误差低于0.7%。研究为储

amy_mhd的博客 124

JavaScript 中的Symbols, Iterators, Generators, Async/Await, and Async Iterators

本文中,我将介绍symbols,global symbols,iterators,iterables,generators ,async/await 和async iterators。我将首先解释“ 为什么 ”他们在那里,并展示他们如何使用一些有用的例子。 符号 在ES2015中,创建了一个新的(第6个)数据类型symbol。 为什么创建这个数据类型呢? 原因#1 - 添加具有向后兼容性的新核心功...

知其白,守其黑;和其光,同其尘。 305

基于强化学习控制策略的三相逆变器仿真

强化学习控制器的核心在于定义状态空间、动作空间、奖励函数以及选择合适的强化学习算法(例如DQN、DDPG等)。对于三相逆变器,状态可以是输出电压、电流等信息;动作则可能是调制指数的变化量;奖励函数则应鼓励快速准确地跟踪参考信号。定义状态空间和动作空间状态空间可以包括逆变器的输出电压、电流及其变化率等信息。动作空间则是控制器可执行的动作,例如PWM信号的调整幅度。matlab深色版本% 定义状态和动作空间维度numObs = 6;% 假设有六个状态变量(例如三相电压和电流)

amy_mhd的博客 135

ES6 (ECMAScript 2015) 详解

ES6,全称ECMAScript 2015,是ECMAScript标准的第6个版本,于2015年6月发布。ECMAScript是JavaScript语言的规范标准,而JavaScript是ECMAScript的一个实现。ES6是JavaScript语言的一次重大更新,引入了大量新的语法特性和API,使JavaScript编程变得更加强大和灵活。现代浏览器已经支持大部分ES6特性:对于需要支持旧浏览器的项目,可以使用Babel等转译工具将ES6代码转换为ES5代码。ES6引入了和两个新的变量声明关键字,用来解

yk_dflkg的博客 2170

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 268

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

探索LINQ-es2015:将LINQ的强大功能带入JavaScript世界

探索LINQ-es2015:将LINQ的强大功能带入JavaScript世界 在这个数字化时代,数据处理是任何应用程序的核心。无论是在后端服务器还是前端浏览器中,能够高效且灵活地操作数据集是一项至关重要的技能。今天,我们将介绍一款名为LINQ-es2015的开源库,它旨在利用最新的JavaScript和TypeScript特性,为现代开发人员提供强大的查询语言集成(LINQ)能力。 项目介绍 LI...

gitblog_00035的博客 324

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ES新特性

ES2015新特性简介1、语言与平台关系2、JS与ES的关系一、let二、const三、数组的解构四、对象的解构 类似数组解构五、 `` 模板字符串六、 带标签的模板字符串七、字符串扩展方法八、参数默认值九、剩余参数...十、展开数组...十一、箭头函数十二、对象字面量增强十三、对象扩展方法十四、Proxy 代理对象十五、Proxy vs Object.defineProperty(目标对象,单个属性,{get(){},set(value){}})十六、Reflect十七、Promise十八、class类十

weixin_38550182的博客 1254

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ES6中 迭代器与生成器,相关知识点、常见使用场景、以及案例

主要介绍了迭代器与生成器相关知识点。什么是迭代器生成器、为什么要引入迭代器生成器,解决了什么问题、迭代器生成器用法与使用场景包括代码案例。

qq_49581491的博客 677

JavaScript之 ES6 ES8 ES9常用新增语法

* ECMAScript由来**ECMA 是欧洲计算机制造商协会(European Computer Manufacturers Association)的缩写。该协会成立于 1961 年,是一个旨在促进欧洲计算机行业发展的标准化组织。ECMA - 262:这是由 Ecma 国际发布的标准文件,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript(ES)。ECMAScript:这是 ECMA 制定的一种脚本语言规范,它是 JavaScript 语言的基础。

xrkhy的博客 1048

Godzilla:革命性ES2015到Go源代码转译器,让JavaScript跑得比Node.js更快?

Godzilla是一款创新的ES2015到Go源代码转译器及运行时环境,它的出现为开发者提供了将JavaScript代码转换为高性能Go语言代码的全新可能。通过这种转换,开发者有望获得比传统Node.js环境更快的执行速度和更高效的资源利用。 ## 什么是Godzilla转译器? Godzilla的核心功能是将符合ES2015标准的JavaScript代码转换为原生Go语言代码,然后通过Go编

gitblog_01100的博客 863

ES6笔记大全(最新)

为什么要学习ES6ES6的版本变动内容最多,具有里程碑意义;ES6加入许多新的语法特性,编程实现更简单、高效;ES6是前端发展趋势,就业必备技能;

weixin_52342741的博客 1466

ES6语法

用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1。

Aming_888的博客 1047

es6基础内容,重点要理解代码

尚硅谷Web前端ES6教程,涵盖ES6-ES11 文章目录尚硅谷Web前端ES6教程,涵盖ES6-ES11前言es6一、es6是什么?二、es6具体内容1.let2.var总结 前言es6 目标: 知道明白说得出es6内容是啥?,那些是重点?那些用处广泛的内容 一、es6是什么? ES6是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。另外,一些

weixin_43601701的博客 372

JS ES6学习总结 拉钩模块二

目前大多数人还没搞明白语言和平台之间的关系。 ECMAScript 概述 ES是JS的扩展语言,也可以说ES就是JS。 ES2015 概述 ES2015 let 与块级作用域 ES5前只有俩种作用域,全局和函数作用域,ES5后多了块级作用域。 但使用let就不能获取到了。 1不能let重复声明 if (true) { var foo = 'zce' var foo = 'zce' console.log(foo) } // OK if (true) { var foo = 'zc

weixin_45345105的博客 445

ES6语法详解

ES6语法及演示案例

m0_62909831的博客 1421

ES6-ES11(ECMAScript2015-ECMAScript2010)

ES6-ES11新特性ECMASript 6 新特性let 关键字const 关键字变量的解构赋值模板字符串简化对象写法箭头函数rest 参数spread (...)扩展运算符Symbol迭代器生成器PromiseSetMapclass 类数值扩展二进制和八进制Number.isFinite() 与 Number.isNaN()Number.parseInt() 与 Number.parseFloat()Math.truncNumber.isInteger对象扩展模块化模块化的好处模块化规范产品ES6 模块

i15730384741的博客 1016
上一篇: ES2015 实现可迭代接口与迭代器模式
下一篇: ECMAScript2016新特性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值