0

0

javascript的生成器函数是什么_如何使用yield进行惰性求值与迭代【教程】

紅蓮之龍

紅蓮之龍

发布时间:2026-01-17 21:53:02

|

183人浏览过

|

来源于php中文网

原创

生成器函数是带暂停能力的函数,调用后返回实现迭代协议的generator对象,代码在每次next()调用时执行到yield处暂停;yield让出控制权并返回值,yield*可委托迭代,支持惰性求值。

javascript的生成器函数是什么_如何使用yield进行惰性求值与迭代【教程】

生成器函数本质是带暂停能力的函数

它不是普通函数,调用后不立即执行,而是返回一个 Generator 对象 —— 这个对象本身就是一个可迭代协议(Symbol.iterator)和迭代器协议(next() 方法)的实现体。关键在于:函数体内的代码只在每次调用 next() 时执行到下一个 yield 处并暂停。

yield 不是返回值,是“让出控制权”的指令

每次遇到 yield,函数暂停,把右侧表达式的值作为 value 返回,并将状态冻结;下次调用 next() 时从暂停处继续,且可接收传入的参数作为上一个 yield 表达式的返回值(注意:首次 next() 传参无效)。

  • yield 只能在生成器函数内使用,否则语法错误
  • 不能在箭头函数中使用 yield
  • yield 后面可以跟任意表达式,包括函数调用、Promise、甚至另一个 yield* 委托
  • 函数末尾隐式返回 { value: undefined, done: true }
function* countdown(n) {
  while (n > 0) {
    yield n;
    n--;
  }
}
const gen = countdown(3);
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: undefined, done: true }

yield* 委托迭代,避免手动遍历

当需要把另一个可迭代对象(数组、字符串、其他生成器等)的值“内联”进当前生成器时,yield* 比循环 + yield 更简洁、更符合语义,且自动处理 returnthrow 传递。

卡拉OK视频制作
卡拉OK视频制作

卡拉OK视频制作,在几分钟内制作出你的卡拉OK视频

下载
  • yield* iterable 会逐个 yield iterable 的每个值
  • 如果 iterable 是另一个生成器,它的 return 值会成为 yield* 表达式的返回值
  • 对数组、Set、Map 使用 yield* 是合法的,因为它们实现了迭代协议
function* numbers() {
  yield 1;
  yield* [2, 3];
  yield* "45";
}
Array.from(numbers()); // [1, 2, 3, '4', '5']

惰性求值的真实价值在“不提前计算”和“按需中断”

生成器常被误认为只是“写法花哨的数组”,但它真正不可替代的地方在于:数据源可能无限、开销巨大或依赖副作用(如 I/O),而你只需要前几个结果。

立即学习Java免费学习笔记(深入)”;

  • 无限序列(斐波那契、素数筛)不会卡死,只算你要的那几项
  • 读取大文件时,每 yield 一行,内存只存当前行,而非全部加载
  • 配合 for...of 或展开运算符 [...gen] 时,一旦外部逻辑 break 或异常退出,生成器内部未执行的代码就不会运行
  • 注意:Array.from(gen)[...gen] 仍会遍历全部,除非你手动控制 next()
function* fibonacci() {
  let [a, b] = [0, 1];
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}
// 只取前 5 项,后面完全不计算
const first5 = [];
const fib = fibonacci();
for (let i = 0; i < 5; i++) {
  first5.push(fib.next().value);
}

生成器的暂停/恢复机制底层依赖执行上下文的保存与还原,不是靠定时器或异步队列;这意味着它天然同步、零调度开销,但也意味着不能直接 await 一个 yield —— 需要 async function* 配合 yield 返回 Promise,再由消费者用 for await...of 消费。这点容易混淆,也最容易漏掉错误处理。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

241

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

128

2025.10.17

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

2

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.8万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号