从0开始学习JavaScript--JavaScript生成器

JavaScript生成器(Generator)是一项强大的语言特性,它允许函数在执行过程中被暂停和恢复,从而实现更灵活的控制流。本文将深入探讨JavaScript生成器的基本概念、用法,并通过丰富的示例代码展示其在实际应用中的优势和强大功能。
生成器的基本概念
生成器是一种特殊类型的函数,通过function*关键字定义。与普通函数不同,生成器函数可以在执行过程中多次暂停和恢复。生成器函数内部使用yield语句来定义生成器的每个阶段的值。
// 示例:基本的生成器
function* simpleGenerator() {yield 1;yield 2;yield 3;
}let generator = simpleGenerator();
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: undefined, done: true }
在这个例子中,simpleGenerator是一个生成器函数,每次调用next方法都会执行到下一个yield语句,返回一个包含value和done属性的对象。
生成器的暂停与恢复
生成器的独特之处在于其能够在执行过程中主动暂停和恢复。这为处理复杂的控制流提供了便利。
// 示例:生成器的暂停与恢复
function* pauseAndResume() {console.log('Start');yield 1;console.log('Pause 1');yield 2;console.log('Pause 2');yield 3;console.log('End');
}let iterator = pauseAndResume();
console.log(iterator.next()); // 输出:Start { value: 1, done: false }
console.log(iterator.next()); // 输出:Pause 1 { value: 2, done: false }
console.log(iterator.next()); // 输出:Pause 2 { value: 3, done: false }
console.log(iterator.next()); // 输出:End { value: undefined, done: true }
在这个例子中,通过每次调用next方法,生成器函数在不同的yield语句处暂停和恢复执行。这种能力使得生成器非常适合处理异步操作、迭代等场景。
生成器的双向通信
生成器不仅能够从外部接收值,还能够向外部传递值。通过next方法的参数,可以在生成器内部接收外部传递的值。
// 示例:生成器的双向通信
function* twoWayCommunication() {let value = yield 'What is your name?';console.log('Received:', value);yield 'Nice to meet you, ' + value;
}let conversation = twoWayCommunication();
console.log(conversation.next()); // 输出:{ value: 'What is your name?', done: false }
console.log(conversation.next('Alice')); // 输出:Received: Alice { value: 'Nice to meet you, Alice', done: false }
console.log(conversation.next()); // 输出:{ value: undefined, done: true }
在这个例子中,通过调用next方法时传递参数,生成器函数内部可以接收到这个参数,并根据逻辑进行处理。这种双向通信的机制为生成器提供了更灵活的应用场景。
生成器与迭代器的结合
生成器和迭代器紧密相连,生成器函数的返回值是一个迭代器对象。可以使用for...of循环等方式方便地遍历生成器产生的值。
// 示例:生成器与迭代器的结合
function* generatorToIterator() {yield 'One';yield 'Two';yield 'Three';
}for (let value of generatorToIterator()) {console.log(value);
}
// 输出:
// One
// Two
// Three
在这个例子中,generatorToIterator是一个生成器函数,通过for...of循环遍历生成器产生的值。这种结合使用方式使得生成器在处理迭代场景时更为便利。
异步生成器
生成器不仅可以处理同步操作,还可以处理异步操作。异步生成器通过yield语句暂停执行,等待异步操作完成后再继续执行。
// 示例:异步生成器
async function* asyncGenerator() {yield await asyncOperation1();yield await asyncOperation2();// ...
}let asyncIterator = asyncGenerator();
console.log(await asyncIterator.next()); // 输出:{ value: result1, done: false }
console.log(await asyncIterator.next()); // 输出:{ value: result2, done: false }
// ...
console.log(await asyncIterator.next()); // 输出:{ value: undefined, done: true }
在这个例子中,asyncGenerator是一个异步生成器,通过await语句等待异步操作的结果,然后使用yield语句返回。这种异步生成器在处理异步任务时提供了更加清晰和可读的代码结构。
生成器的异常处理
生成器函数内部可以捕获和处理异常,这使得代码在出错时能够更好地进行处理。
// 示例:生成器的异常处理
function* generatorWithException() {try {yield 'Step 1';yield 'Step 2';throw new Error('Exception!');yield 'Step 3'; // 这一步不会执行} catch (error) {yield 'Caught exception: ' + error.message;}
}let generatorWithExceptionIterator = generatorWithException();
console.log(generatorWithExceptionIterator.next()); // 输出:{ value: 'Step 1', done: false }
console.log(generatorWithExceptionIterator.next()); // 输出:{ value: 'Step 2', done: false }
console.log(generatorWithExceptionIterator.next()); // 输出:{ value: 'Caught exception: Exception!', done: false }
console.log(generatorWithExceptionIterator.next()); // 输出:{ value: undefined, done: true }
在这个例子中,生成器函数中的throw语句引发了异常,然后在生成器内部通过catch块捕获并处理异常。
总结
通过本文的深入探讨,学习了JavaScript生成器的基本概念、暂停与恢复的机制,以及与迭代器、异步操作等的结合使用。生成器在异步编程、迭代处理等场景中展现出了强大的功能,使得代码更具可读性和灵活性。
随着JavaScript标准的不断演进,可以期待生成器在更多领域展现出更为丰富的用途。通过深入学习和实践,大家可以更好地利用生成器来简化代码、提高可维护性,从而在项目中取得更好的开发效果。
相关文章:
从0开始学习JavaScript--JavaScript生成器
JavaScript生成器(Generator)是一项强大的语言特性,它允许函数在执行过程中被暂停和恢复,从而实现更灵活的控制流。本文将深入探讨JavaScript生成器的基本概念、用法,并通过丰富的示例代码展示其在实际应用中的优势和强…...
householder进行矩阵QR分解
文章目录 1. Householder 进行QR分解 1. Householder 进行QR分解 A Q R (1) AQR\tag1 AQR(1) A [ 1 2 0 1 1 0 3 1 1 0 3 2 1 2 0 2 ] (2) A\begin{bmatrix}1&2&0&1\\\\1&0&3&1\\\\1&0&3&2\\\\1&2&0&2\end{bmatrix}\tag2 A…...
利用叉积计算向量的旋向及折线段的拐向
一、向量叉积 两个向量 u u u、 v v v的叉积写作 u v n ∥ u ∥ ∥ v ∥ s i n θ \mathbf{u \times v n \left \| u \right \| \left \| v \right \| sin\theta } uvn∥u∥∥v∥sinθ 式中, n n n: 与 u u u、 v v v均垂直的单位向量,theta是两向量…...
Vmware 扩展硬盘空间后的操作-Ubuntu
在VMware中扩展了Ubuntu虚拟机的硬盘容量后,你需要在Ubuntu内部进行操作才能使用新增的空间。过程包括为增加的空间建立分区、格式化以及挂载该分区供使用。下面是具体的步骤: 首先登录到你的Ubuntu系统,用lsblk命令查看分区情况。这样你可以…...
Rust错误处理:Result
文章目录 简介错误匹配 Rust基础教程: 初步⚙ 所有权⚙ 结构体和枚举类⚙ 函数进阶⚙ 泛型和特征⚙ 并发和线程通信⚙ cargo包管理⚙ 可空类型Option Rust进阶教程: 用宏实现参数可变的函数⚙ 类函数宏 简介 Rust中没有提供类似try…catch之类…...
1410.HTML 实体解析器
题目来源: leetcode题目,网址:1410. HTML 实体解析器 - 力扣(LeetCode) 解题思路: 使用map存放特殊字符串及其应被替换为的字符串。然后遍历字符串替换 map 中的字符串即可。 解题代码: …...
Python通过串口收发文件
单位内外网是隔离的,USB对拷线被禁用,安全优盘使用太费事,就想到了通过串口传输文件. import serial from xmodem import XMODEM import osdef Send_File(filepath, portCOM8, baudrate115200):bn os.path.basename(filepath)filesize os.stat(filepath).st_sizestrSendFile…...
[crash] cxa_pure_virtual 崩溃分析与原理
摘要:工作过程中处理线上的崩溃时发现了一例cxa_pure_virtual相关的crash,直接看堆栈基本山很容易确认是有异步调用导致出发了ABI的异常。但是对于为什么会触发cxa_pure_virtual虽然有大致的猜测但是没有直接的证据,因此本文主要描述触发该类…...
2023年学习Go语言是否值得?探索Go语言的魅力
关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 作为一门流行且不断增长的编程语言,Go语言在2023年是否值得学习呢?让我们来看看学习Go语言的好处以及为何…...
【C++11】=default与=delete关键字使用详解
系列文章目录 C11新特性使用详解-持续更新 文章目录 系列文章目录一、default关键字1. 为什么要引入default关键字2. 注意事项3. 使用default关键字有什么好处4.实例代码 二、delete关键字1. 为什么要引入delete关键字2. 注意事项3. 使用场景3.1删除默认构造函数3.2 删除拷贝构…...
[开源]Web端的P2P文件传输工具,简单安全高效的P2P文件传输服务
一、开源项目简介 小鹿快传 - 在线P2P文件传输工具 小鹿快传是一款Web端的P2P文件传输工具,使用了WebRTC技术实现P2P连接和文件传输。 二、开源协议 使用MIT开源协议 三、界面展示 产品截图 四、功能概述 简单安全高效的P2P文件传输服务 小鹿快传是一款Web端…...
边缘计算多角色智能计量插座 x 资产显示标签:实现资产追踪与能耗管理的无缝结合
越来越多智慧园区、智慧工厂、智慧医院、智慧商业、智慧仓储物流等企业商家对精细化、多元化智能生态应用场景的提升,顺应国家节能减排、环保的时代潮流,设计一款基于融合以太网/WiFi/蓝牙智能控制的智能多角色插座应运而生,赋予智能插座以遥…...
chromium证书校验流程SM2WithSM3(C++源码说明)
文章目录 一、证书链二、证书链校验过程三、证书链签名校验图解四、C++源码4.1 编译TASSL4.2 代码一,直接读取签名值方法4.3 代码二(推荐)4.3.1 获取证书的签名数据4.3.2 获取证书的签名值4.3.3 从证书中获取公钥4.3.4 完整代码4.3.5 代码地址五、补充说明5.1 SM2的Z值算法以…...
3分钟使用 WebSocket 搭建属于自己的聊天室(WebSocket 原理、应用解析)
文章目录 WebSocket 的由来WebSocket 是什么WebSocket 优缺点优点缺点 WebSocket 适用场景主流浏览器对 WebSocket 的兼容性WebSocket 通信过程以及原理建立连接具体过程示例Sec-WebSocket-KeySec-WebSocket-Extensions 数据通信数据帧帧头(Frame Header)…...
Jina AI 的 8K 向量模型上线 AWS Marketplace,支持本地部署!
在当前多模态 AI 和大模型技术风头正劲的背景下,Jina AI 始终领跑于创新前沿,技术领先。2023 年 10 月 30 日,Jina AI 隆重推出 jina-embeddings-v2,这是全球首款支持 8192 输入长度的开源向量大模型,其性能媲美 OpenA…...
ubuntu上查看各个进程的实时CPUMEM占用的办法
top常见参数top界面分析system monitorhtop1、查看htop的使用说明2、显示树状结构3、htop使用好文推荐top top的用法应该是最为普遍的 常见参数 -d 更新频率,top显示的界面几秒钟更新一次 -n 更新的次数,top显示的界面更新多少次之后就自动结束了 当然也可以将top日志通过…...
电大搜题——打开学习之门的最佳选择
在快节奏的现代社会,追求知识和学习成为愈发重要的需求。然而,许多人由于时间和机会的限制,无法实现自己的教育梦想。就在这个时候,安徽开放大学广播电视大学通过推出电大搜题微信公众号,为广大学子提供了一个便捷高效…...
[论文笔记] Scaling Laws for Neural Language Models
概览: 一、总结 计算量、数据集大小、模型参数量大小的幂律 与 训练损失呈现 线性关系。 三个参数同时放大时,如何得到最佳的性能? 更大的模型 需要 更少的样本 就能达到相同的效果。 </...
【每日OJ —— 622. 设计循环队列】
每日OJ —— 622. 设计循环队列 1.题目:622. 设计循环队列2.解法2.1.解法讲解2.1.1.算法讲解2.1.2.代码实现2.1.3.提交通过展示 1.题目:622. 设计循环队列 2.解法 1.本题有很多解法:可以使用数组,单链表,双链表&#x…...
【Vue】生命周期一文详解
目录 一、beforeCreate 下面是一个beforeCreate的简单使用示例: 在控制台输出before create hook。 二、created 下面是一个created的简单使用示例: 在控制台输出created hook。 三、beforeMount 下面是一个beforeMount的简单使用示例࿱…...
工业语言:08 HMI不是孤胆英雄:和 PLC、SCADA、机器人“团战”
08 HMI不是孤胆英雄:和 PLC、SCADA、机器人“团战” HMI 不是孤独的屏幕,它是整个工厂系统的“语言枢纽”。 前面咱们把HMI从“长啥样”聊到“十八般武艺”,今天直接揭秘它的“队友关系”——单独一个HMI最多算个“会说话的仪表盘”,但拉上PLC、SCADA、机器人组团,那才是工…...
基于Webhook的代码仓库事件监听与通知系统设计与实现
1. 项目概述:一个为开发者量身打造的代码通知管家如果你和我一样,每天需要同时盯着好几个代码仓库的动态,无论是自己负责的项目,还是团队协作的公共库,那么你一定经历过这种场景:某个关键分支被推送了&…...
从点亮LED到驱动外设:手把手教你用RT-Thread玩转星火一号开发板
从点亮LED到驱动外设:手把手教你用RT-Thread玩转星火一号开发板 第一次拿到星火一号开发板时,面对密密麻麻的芯片引脚和陌生的RT-Thread环境,不少开发者会感到无从下手。本文将带你从最基础的LED控制开始,逐步深入SPI Flash读写、…...
Vue.js 表单
Vue.js 表单 Vue 使用 v-model 指令在表单控件上实现双向数据绑定,自动处理输入值与数据的同步。一、v-model 基本原理 <!-- v-model 是以下写法的语法糖 --> <input v-model"msg" /><!-- 等价于 --> <input :value"msg" …...
如何快速掌握华为光猫配置解密工具:新手必看的完整教程
如何快速掌握华为光猫配置解密工具:新手必看的完整教程 【免费下载链接】HuaWei-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/hu/HuaWei-Optical-Network-Terminal-Decoder 华为光猫配置解密工具是一款专为解密华为光猫配置…...
MTKClient终极指南:解锁联发科设备的底层控制权
MTKClient终极指南:解锁联发科设备的底层控制权 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient MTKClient是一款革命性的开源工具,专为联发科芯片设备提供深度底层操…...
蓝桥杯单片机省赛必看:DS1302时钟模块从驱动到数码管显示的完整避坑指南
蓝桥杯单片机竞赛实战:DS1302时钟模块全流程开发与调试精要 在蓝桥杯单片机竞赛的备战过程中,实时时钟模块DS1302的稳定运行往往成为决定作品成败的关键一环。许多参赛选手在初次接触这个看似简单的时钟芯片时,常会陷入驱动移植失败、时间显示…...
3分钟掌握Iwara视频下载技巧:高效批量保存心仪内容
3分钟掌握Iwara视频下载技巧:高效批量保存心仪内容 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 你是否曾经在Iwara上看到精彩的视频却无法保存?是否想…...
视频转PPT神器:3分钟自动提取视频中的PPT内容
视频转PPT神器:3分钟自动提取视频中的PPT内容 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 还在为从会议录像、教学视频中手动截图PPT而烦恼吗?extract-vid…...
保姆级教程:手把手教你修改PX4机型文件,让自定义无人机在QGC上完美显示
深度解析PX4机型文件定制:从脚本修改到QGC无缝集成实战指南 当你完成了一架自定义无人机的PX4固件开发,满心欢喜地打开QGroundControl(QGC)准备调试时,却发现机型列表中根本找不到自己的作品——这种挫败感我太熟悉了…...
