当前位置: 首页 > news >正文

【js自学打卡11】生成器函数(generator函数)的使用总结+代码举例

力扣的js入门免费题刷完了,开始自己找题练练,顺便捡捡知识点

力扣2649

1.思路

一眼递归,但事实证明也可以直接flat手撕。

arr.flat(Infinity) //直接扁平化到最底层

涉及到了一些关于生成器和异步编程相关的知识点,学一下。

2.关于生成器函数

在JavaScript中,星号(*)用于定义生成器函数(generator function)。生成器函数是一种特殊类型的函数,它允许你在函数执行过程中暂停和恢复,同时保持函数的状态。
以下是关于生成器函数和星号的一些关键点:

  1. 生成器函数定义
    使用星号定义生成器函数,例如:
function* generatorFunction() {// ...
}
  1. 生成器函数执行
    调用生成器函数并不会立即执行其内部的代码,而是返回一个生成器对象(generator object)。生成器对象实现了迭代器协议,因此可以使用next()方法来逐步执行生成器函数内部的代码。
  2. yield关键字
    在生成器函数内部,yield关键字用于暂停函数执行,并返回一个值。后续调用生成器对象的next()方法会恢复函数执行,直到下一个yield表达式。
  3. yield*表达式
    yield*用于委托给另一个生成器函数或可迭代对象。在你提供的inorderTraversal函数中,yield*用于递归地遍历数组,并逐个产出元素。
    以下是对你提供的inorderTraversal函数的解释:
var inorderTraversal = function* (arr) {for (const item of arr) {if (Array.isArray(item)) {// 如果当前项是一个数组,递归地委托给inorderTraversal生成器// 并产出递归遍历的结果yield* inorderTraversal(item);} else {// 如果当前项不是数组,直接产出该项yield item;}}
};

在这个函数中,当遇到一个数组项时,它使用yield*来委托给inorderTraversal自身,从而实现对嵌套数组的深度优先遍历。对于非数组项,它使用yield来产出该项。最终结果是,调用这个生成器函数可以逐个产出所有非数组元素,无论它们在原始数组中的嵌套深度如何。
例如,使用这个生成器函数:

const nestedArray = [1, [2, [3, 4], 5], 6];
const traversal = inorderTraversal(nestedArray);
for (const value of traversal) {console.log(value); // 输出: 1, 2, 3, 4, 5, 6
}

这将按照中序遍历的方式打印出嵌套数组中的所有数字。
5. 使用.next()方法控制的案例
当然,以下是一个使用生成器函数和next()方法的简单案例。这个例子中的生成器函数会逐步产出一系列的斐波那契数列。

function* fibonacciGenerator() {let a = 1, b = 1;while (true) {yield a;[a, b] = [b, a + b]; // 使用数组解构赋值来交换a和b的值,并计算下一个斐波那契数}
}
// 创建生成器对象
const fib = fibonacciGenerator();
// 使用next()方法来获取斐波那契数列的前10个数字
for (let i = 0; i < 10; i++) {console.log(fib.next().value);
}

执行上述代码将输出斐波那契数列的前10个数字:

1
1
2
3
5
8
13
21
34
55

解释:

  • fibonacciGenerator是一个生成器函数,它使用yield来产出斐波那契数列的每个数字。
  • 在生成器函数内部,我们使用一个无限循环来持续计算斐波那契数列的下一个数字,并在每次循环中使用yield来产出当前的数字。
  • 创建生成器对象fib后,我们通过循环调用next()方法10次来获取数列的前10个数字。
  • 每次调用next()方法时,生成器函数都会从上次yield的地方继续执行,计算下一个斐波那契数,并再次yield它。
  • next().value返回的是yield产出的值,即当前的斐波那契数。
    注意,由于生成器函数内部是一个无限循环,如果你不限制next()的调用次数,它会无限产出斐波那契数列的数字。在实际使用中,你通常会根据需要来决定调用next()的次数,或者使用其他逻辑来终止生成器函数的执行。

3.省流总结

· generator函数,也是用于解决异步编程问题的一个方法。很标志性的结构是比一般函数多了一个*function*(){},返回的是内部指针。在函数内部有yield,意思是在这里移交执行权跳到下一个任务。
· 使用前先创建生成器对象
· 可以通过.next()来获取生成器对象,以及用value属性调取对象值

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 力扣题解(盈利计划)
  • C++多继承与虚继承
  • Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持
  • Unity UGUI 之 Canvas画布
  • 深入理解TCP/IP协议中的三次握手
  • GD32 MCU是如何进入中断函数的
  • Android 10.0 蓝牙音乐获取歌手、歌曲等信息功能实现
  • 微服务重启优化kafka+EurekaNotificationServerListUpdater
  • 【Docker】Docker-compose 单机容器集群编排工具
  • Armpro搭建教程全开源版的教程
  • 【BUG】已解决: KeyboardInterrupt
  • Ubuntu16.04环境下Baxter机器人开发环境搭建要点说明
  • windows ssh的登录,私钥权限太开放 WARNING: UNPROTECTED PRIVATE KEY FILE!
  • 在 CI/CD Pipeline 中实施持续测试的最佳实践!
  • C 语言实例 - 使用引用循环替换数值
  • python3.6+scrapy+mysql 爬虫实战
  • 时间复杂度分析经典问题——最大子序列和
  • @jsonView过滤属性
  • co.js - 让异步代码同步化
  • FastReport在线报表设计器工作原理
  • hadoop集群管理系统搭建规划说明
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从setTimeout-setInterval看JS线程
  • 对超线程几个不同角度的解释
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 山寨一个 Promise
  • 什么软件可以剪辑音乐?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 一个完整Java Web项目背后的密码
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # linux 中使用 visudo 命令,怎么保存退出?
  • #微信小程序:微信小程序常见的配置传旨
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (javaweb)Http协议
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计ssm电影分享网站
  • (接口自动化)Python3操作MySQL数据库
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转) ns2/nam与nam实现相关的文件
  • (转)h264中avc和flv数据的解析
  • (转)可以带来幸福的一本书
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .apk 成为历史!
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .naturalWidth 和naturalHeight属性,
  • .NET 4.0中的泛型协变和反变
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET建议使用的大小写命名原则
  • .NET周刊【7月第4期 2024-07-28】
  • /etc/shadow字段详解
  • @Bean注解详解