【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属性调取对象值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端 React 框架面试200题(三)

面试题 65. 在使用 React Router时&#xff0c;如何获取当前页面的路由或浏览器中地址栏中的地址&#xff1f; 参考回答&#xff1a; 在当前组件的 props中&#xff0c;包含 location属性对象&#xff0c;包含当前页面路由地址信息&#xff0c;在 match中存储当前路由的参数等…

数字图像处理笔记(二)---- 像素加图像统计特征

系列文章目录 文章目录 系列文章目录前言一、认识数字图像二、图像的数学描述二、图像的统计特征总结 前言 慕课视频地址 一、认识数字图像 图像分为模拟图像和数字图像。要想获得数字图像需要通过采样量化编码等过程。 量化和采样的过程是将模拟信号转化为数字信号。编码的过…

JVM常用工具中jmap实现手动进行堆转储(heap dump文件)并使用MAT(Memory Analyzer Tool)进行堆分析-内存消耗分析

场景 JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用&#xff1a; JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用_jvm分析工具-CSDN博客 上面讲了jmap的简单使用。 下面记录其常用功能&#xff0c;实现堆…

sqlite数据库,轻量级数据库的使用

什么是sqlite数据库 sqlite是具有零配置、无服务的特点&#xff0c;遵循 ACID 规则&#xff0c;是一款备受欢迎的轻量级数据库。 tips&#xff1a;ACID 规则即&#xff0c;A&#xff08;原子性&#xff09;、C&#xff08;一致性&#xff09;、I&#xff08;独立性&#xff0…

前端npm下载依赖 idealTree:vue3-demo: sill idealTree buildDeps解决方案

第一步 第二步 第三步 第四步 直接输入npm install就可以安装依赖了

SpringBoot源码(1)ApplicationContext和BeanFactory

1、调用getBean方法 SpringBootApplication public class SpringBootDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext SpringApplication.run(SpringBootDemoApplication.class, args);applicationContext.get…

Java强软弱虚引用的特点以及应用场景(面试重点)

强&#xff1a;即使OOM也不回收软&#xff1a;内存溢出前回收弱&#xff1a;只要垃圾收集就死虚&#xff1a;对垃圾收集没关系&#xff0c;只有得到通知&#xff08;插眼&#xff0c;也操作不了对象、只能看到它还活着&#xff09; 一、软引用 代码示例&#xff1a; public cl…

【C++开源】GuiLite:超轻量UI框架-入门

开发环境说明 使用visual Studio 2022进行开发 下载源码 从如下的网址进行源码和示例代码的下载: GitHub源码网址为:idea4good/GuiLite示例代码路径为:idea4good/GuiLiteExample使用方法 GuiLite是一个仅有头文件的一个库,使用的时候直接include到自己的UIcode.cpp文件…

Linux处理文件sed

一、什么是sed sed全称&#xff08;stream editor&#xff09;流式编辑器&#xff0c;Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等&#xff0c;工作流程如下sed 是一种在线的、非交互式的编辑器&#xff0c;它一次处理一行内容。处理时&#xff…

十七、(正点原子)Linux LCD驱动

一、Framebuffer设备 在 Linux 中应用程序通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息。 先来看一下裸机 LCD 驱动如下&#xff1a; ①、初始化 I.MX6U 的 eLCDIF 控制器&#xff0c;重点是 LCD 屏幕宽(width)、高(height)、 hspw、 hbp、 hfp、 vspw…

【Python】连接MySQL数据库:详细教程与示例代码

文章目录 1. 安装必要的库2. 建立与MySQL的连接3. 执行SQL查询4. 插入数据5. 更新数据6. 删除数据7. 错误处理8. 小结 在数据驱动的开发中&#xff0c;连接数据库是一个至关重要的技能。Python作为一门强大的编程语言&#xff0c;提供了多种方式连接并操作MySQL数据库。本文将详…

【时时三省】(C语言基础)函数和数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 函数 跟数学里面的函数很相似 数组 一组相同类型的元素的集合 比如把5个整形1-5存起来 int arr&#xff3b;10&#xff3d;&#xff1d;&#xff5b;1&#xff0c;2&#xff0c;3&#x…

转型做产品经理,考NPDP有什么好处?

机会是留给有准备的人的&#xff0c;如果此刻的你想要转岗但又没有方向&#xff0c;建议你可以考虑下产品经理这个岗位&#xff0c;产品经理是一个非技术型的岗位&#xff0c;但是懂一些技术相关的知识会更好的和技术部门沟通&#xff0c;能更好的从技术部门的角度理解需求的可…

浏览器打开抽奖系统html

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…

验证跨设备挂载文件系统可行性命令

1.安装服务器端nfs-server-kernel 软件 sudo apt-get install nfs-kernel-server 2.配置服务器端软件路径 sudo vim /etc/default/nfs-kernel-server sudo service nfs-kernel-server statussudo service nfs-kernel-server restartsudo service nfs-kernel-server statu…

用Python爬虫能实现什么?

Python 是进行网络爬虫开发的一个非常流行和强大的语言&#xff0c;这主要得益于其丰富的库和框架&#xff0c;比如 requests、BeautifulSoup、Scrapy 等。下面我将简要介绍 Python 爬虫的基础知识和几个关键步骤。 1. 爬虫的基本原理 网络爬虫&#xff08;Web Crawler&#…

antdesgin table 组件下载成excel

文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下&#xff0c;需要添加下载功能 import React, { useState } from rea…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

Go语言 Import导入

本文主要介绍Go语言import导入使用时注意事项和功能实现示例。 目录 Import 创建功能文件夹 加法 减法 主函数 优化导入的包名 .引入方法 总结 Import 创建功能文件夹 做一个计算器来演示&#xff0c;首先创建test文件夹。 加法 在test文件夹中创建add文件夹&#xff…

别卷模型,卷应用:从李彦宏的AI观点谈起

2024年7月4日&#xff0c;世界人工智能大会暨人工智能全球治理高级别会议在上海世博中心隆重召开。百度创始人、董事长兼首席执行官李彦宏在产业发展主论坛上的发言&#xff0c;引起了广泛关注。他提出&#xff1a;“大家不要卷模型&#xff0c;要卷应用&#xff01;”这一观点…