第七讲_JavaScript的Iterator和Generator

JavaScript的Iterator和Generator

  • 1. Iterator
    • 1.2 for-of语法糖
  • 2. Generator
    • 2.1 定义一个生成器函数
    • 2.2 常用的方法
    • 2.3 基本用法
    • 2.4 传参的用法
    • 2.5 异步的用法

1. Iterator

ES6 中,默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性。一个数据结构只要拥有 Symbol.iteration 属性,就是可遍历的。Symbol.iterator 是一个函数,返回当前数据结构的遍历器。Iterator 提供了 next() 方法用以返回迭代器结果对象。

在这里插入图片描述

let arr = ["a", "b", "c"];// 获取数组的Iterator
let symbolIterator = arr[Symbol.iterator]();// 遍历数组
let value = symbolIterator.next();
while (value.value) {console.log(value.value);value = symbolIterator.next();
}

1.2 for-of语法糖

拥有 Symbol.iteration 属性的数据结构,可以通过 for-of 遍历。

  • Array
  • Set
  • Map
  • String
  • arguments 对象
  • NodeList 对象
function test(param1, param2) {// 函数体内都有一个arguments对象,装着所有参数for (param of arguments) {console.log(param)}
}test(1, 2);

2. Generator

Generator 对象由生成器函数返回。Generator 是隐藏类 Iterator 的子类。

2.1 定义一个生成器函数

// 与定义普通函数的不同在于:function关键字后面跟一个*
function* generator() {
}// 调用生成器函数,只是进行实例化,并不执行函数体的代码
let iterator = generator();

2.2 常用的方法

  • next():返回 yield 表达式生成的值。
  • return():类似于在当前的生成器主体的暂停位置插入 return 语句
  • throw():类似于在当前的生成器主体的暂停位置插入 throw 语句

2.3 基本用法

// 定义一个 Generator 函数
function* generator() {console.log("a");// yield 表达式yield 1;console.log("b");yield 2;console.log("c");
}// 调用生成器函数,只是进行实例化,并不执行函数体的代码
let iterator = generator();// 调用 next() 开始执行函数体的代码,遇到 yield 停止执行,并返回 yield 表达式生成的值
// yield 表达式返回的是一个对象,包含 value 和 done 两个属性
let result1 = iterator.next();
console.log(result1.value);// 再调用 next(),继续执行,遇到 yield 停止执行
let result2 = iterator.next();
console.log(result2.value);// 再调用 next(),继续执行
iterator.next();

2.4 传参的用法

// 定义一个 Generator 函数
function* generator() {console.log("a");// yield表达式前面的变量param1,用来接收next()传递的参数let param1 = yield 1;console.log(param1);let param2 = yield 2;console.log(param2);
}let iterator = generator();// 第一个 next() 在遇到 yield 就停止了,此时 next() 传递的参数还没有赋值给变量 param1,并且该参数会被丢失
let result1 = iterator.next("x");
console.log(result1.value);// 第二个 next() 让代码继续执行,先把参数赋值给 param1
let result2 = iterator.next("y");
console.log(result2.value);iterator.next("z");

2.5 异步的用法

// 定义一个异步的生成器函数
async function* generator() {yield new Promise( (resolve, reject) => {// 进行异步操作setTimeout( () => {resolve("1000ms");}, 1000);} );yield new Promise( (resolve, reject) => {// 进行异步操作setTimeout( () => {resolve("2000ms");}, 2000);} );
}let iterator = generator();// async 返回的是一个promise,可以采用链式调用
// data 是一个对象,包含 value 和 done 两个属性
iterator.next().then((data) => {console.log(data);return iterator.next();
}).then((data) => {console.log(data);return iterator.next();
}).then((data) => {console.log(data);return iterator.next();
}).catch((err) => {console.log(err);
});

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

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

相关文章

字节跳动新一代云原生消息队列实践

作者:火山引擎云原生计算研发工程师|雷丽媛 上文我们了解了在字节跳动内部业务快速增长的推动下,经典消息队列 Kafka 的劣势开始逐渐暴露,在弹性、规模、成本及运维方面都无法满足业务需求。因此字节消息队列团队研发了计算存储分…

RISC-V指令集之RV32I

RISC-V指令集之RV32I 1 RV32I的寄存器2 RV32I的指令2.1 算术运算指令2.2 逻辑运算指令2.3 移位运算指令2.4 内存读写指令2.5 分支与跳转指令 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 RV32I的寄存器 如下图,列出了RV32I 寄存器…

力扣hot100 数据流的中位数 大小根堆

Problem: 295. 数据流的中位数 文章目录 思路复杂度💖 Code 思路 👨‍🏫 参考 大根堆维护较小值(堆顶即中位数),小根堆维护较大值(堆顶可能是中位数之一)维护小堆长度较长&#x…

idea搭建spring5.3.x源码环境

1.写在前面的话 碰到了不少想阅读或者学习spring源码的同学,但是第一步搭建这个源码阅读环境就能难倒了一大批人。下面我就以spring5.3.x这个源码分支,来具体演示一下搭建过程。 2. 下载源码 下载源码这一步,说实话,由于某些原…

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址:https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本: [rootmaster1 kube-state-metrics]# ll 总用量 …

并查集(高阶数据结构)

目录 一、并查集的原理 二、并查集的实现 2.1 并查集的初始化 2.2 查找元素所在的集合 2.3 判断两个元素是否在同一个集合 2.4 合并两个元素所在的集合 2.5 获取并查集中集合的个数 2.6 并查集的路径压缩 2.7 元素的编号问题 三、并查集题目 3.1 省份的数量 3.2 等…

R-kknn包-类别插值可视化绘制

前面的推文我们介绍了使用scikit-learn结合分类散点数据,构建机器学习分类模型并将模型结果可视化展示,具体链接如下: 机器学习和可视化还能一起这样用?Python教你全搞定。今天这篇推文,我们就使用R语言的kknn包进行类…

【2023地理设计组一等奖】基于机器学习的地下水仿真与时空分析

作品介绍 1 设计思想 1.1 作品背景 华北平原是我国最重要的粮棉产地之一,然而近年来农业的低效用水以及过度压采正逐步加剧其地下水资源的紧张性,为经济可持续发展带来重大风险。而地下水动态变化与人为干预、全球气候波动呈现出高度相关性,因此,地下水的仿真模拟对保障粮…

JMeter 下载、安装、启动

JMeter安装部署依赖Java环境,所以首先得安装JDK。 JDK下载JDK环境变量配置 ① 新建系统环境变量JAVA_HOME ② 编辑系统变量Path ③ 新建系统变量CLASSPATH变量 JMeter下载安装 Apache JMeter - Apache JMeter™ JMeter安装部署依赖Java环境,所以首…

sql注入之GETSHELL

2024.2.1 GETSHELL 利用SQL注入获取MYSQL数据库权限的要求: 文件读写基本要求: 是root用户最高权限 知道网站的绝对路径 文件读写注入的原理: 利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息 文件读写…

Qt设计师中(没有现成的控件):如何添加QToolBar工具栏

1、在QtCreator设计师界面中,在MainWindow上右键,有“添加工具栏”菜单项 2、但只有在MainWindow上右键才有,在其它控件上方点击则没有,那么怎么在对话框上添加呢? 可以添加一个QWidget,然后手动在ui文件里把class改为QToolBar就…

canvas设置全局透明度globalAlpha(图文示例)

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种,包括:示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示,有:急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…

环状热力图R语言画法

环状热力图(Circular Heatmap)是一种以环状布局展示数据的可视化方法。它结合了热力图和极坐标系统,能够有效地显示数据的关系、模式和趋势。 环状热力图通常用于可视化二维数据矩阵,其中行和列代表不同的类别或变量,…

K8S-NFS-StorageClass

工作流程 K8s中部署NFS-StorageClass K8s的StorageClass提供了为集群动态创建PV的能力。 1.部署NFS服务 2.选择NFS的Provinisoner驱动 K8S中没有内置的NFS的制备器,而定义StorageClass的时候需要指定制备器(Pervisioner),所以需要&#xf…

OpenHarmony—开发及引用静态共享包(API 9)

HAR(Harmony Archive)是静态共享包,可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。 接下来&a…

springboot146基于Spring Boot的可盈保险合同管理系统的设计与实现

可盈保险合同管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本可盈保险合同管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时…

富文本编辑器CKEditor4简单使用-02(常用插件安装及使用)

富文本编辑器CKEditor4简单使用-02(常用插件安装及使用) 1. CKEditor4 入门2. 下载并安装常用插件——Language插件2.1 下载插件2.2 下载并安装 Language 插件2.2.1 下载 Language 插件2.2.2 下载 Menu Button插件以及后续的各依赖插件2.2.3 安装下载的L…

YOLOv5改进 | Conv篇 | 结合Dual思想利用HetConv创新一种全新轻量化结构CSPHet(参数量下降20W,)

一、本文介绍 本文给大家带来的改进机制是我结合Dual的思想利用HetConv提出一种全新的结构CSPHet,我们将其用于替换我们的C3结构,可以将参数降低越20W,GFLOPs降低至4.1GFLOPs,同时本文的结构比我提出的另一个CSPPC精度更高,但是轻量化效果要差一点同时本文结构为我独家创…

ElasticSearch-IK分词器(elasticsearch插件)安装配置和ElasticSearch的Rest命令测试

四、IK分词器(elasticsearch插件) IK分词器:中文分词器 分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一一个匹配操作&…