第七讲_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.rhkb.cn/news/249427.html

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

相关文章

vue前端html导出pdf

package.json中添加依赖 调用方: import htmlToPdf from ../../../utils/file/htmlToPdf.js// 下载方法,pdfDownloadDpi为onClickDownLoad() {htmlToPdf.getPdf(标题1, jsfgyzcpgxmShow, this.pdfDownloadDpi)}htmlToPdf.js // 页面导出为pdf格式 imp…

微分几何——梅向明第四版学习笔记(二) 曲面论、外微分形式和活动标架

目录 引出曲面论曲面的概念曲面的切平面和法线曲面的第一基本形式曲面域的面积 曲面的第二基本形式曲面上曲线的曲率曲面的渐进方向曲面的共轭方向曲面的主方向和曲率线 曲面的三个曲率主曲率高斯曲率,平均曲率案例 曲面在一点邻近的结构曲面的第三基本形式高斯曲率…

zookeeper(2) 服务器动态上下线监听和分布式锁案例

案例一:服务器动态上下线监听 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知 到主节点服务器的上下线。 1.服务端代码 package com.atguigu.case1;import org.apache.zookeeper.*;import java.io…

静态时序分析:时序弧以及其时序敏感(单调性)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中,不管是组合逻辑单元(如与门、或门、与非门等)还是时序逻辑(D触发器等)在时序建模时…

springCloud gateway 防止XSS漏洞

springCloud gateway 防止XSS漏洞 一.XSS(跨站脚本)漏洞详解1.XSS的原理和分类2.XSS漏洞的危害3.XSS的防御 二.Java开发中防范XSS跨站脚本攻击的思路三.相关代码(适用于spring cloud gateway)1.CacheBodyGlobalFilter.java2.XssRequestGlobalFilter.java…

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件,它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载:Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力,让用户能够迅…

STM32G4 系列命名规则

STM32G4产品线 基础型系列STM32G4x1 具有入门级模拟外设配置,单存储区Flash,支持的Flash存储器容量范围从32到512KB。 增强型系列STM32G4x3 与基本型器件相比具有更多数量的模拟外设,以及双存储区Flash,Flash存储器容量也提高…

C#学习笔记_类(Class)

类的定义 类的定义是以关键字 class 开始,后跟类的名称。类的主体,包含在一对花括号内。 语法格式如下: 访问标识符 class 类名 {//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…

【Day37】代码随想录之贪心_738.单调递增的数字_968.监控二叉树

文章目录 738.单调递增的数字968.监控二叉树 738.单调递增的数字 参考文档:代码随想录 题目: 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 (当且仅当每个相…

你的MiniFilter安全吗?

简介 筛选器管理器 (FltMgr.sys)是Windows系统提供的内核模式驱动程序, 用于实现和公开文件系统筛选器驱动程序中通常所需的功能; 第三方文件系统筛选器开发人员可以使用FltMgr的功能可以更加简单的编写文件过滤驱动, 这种驱动我们通常称为MiniFilter, 下面是MiniFilter的基本…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初,学习状态回顾 开稿时间:2024-1-23 归家百里去,飘雪送客迟。 搁笔日又久,一顾迷惘时。 我们饱含着过去的习惯,缺乏自我意识是毒药,反思和回顾是解药。 文章目录 2024年初,学习状态回顾一…

虚拟机(VMware)ubuntu16.04 直接连接网口设备 USRP 吊舱

编辑虚拟网络编辑器 点击之后 选择网卡之后,点击确定。 电脑配置 使用了:192.168.2.56 虚拟机内部配置 和PC的配置一致

【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗

一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…

Zoho Mail 2023:回顾过去,展望未来:不断进化的企业级邮箱解决方案

当我们告别又一个非凡的一年时,我们想回顾一下Zoho Mail如何融合传统与创新。我们迎来了成立15周年,这是一个由客户、合作伙伴和我们的敬业团队共同庆祝的里程碑。与我们一起回顾这段旅程,探索定义Zoho Mail历史篇章的敏捷性、精确性和创新性…

Spring 事务原理二

该说些什么呢?一连几天,我都沉溺在孤芳自赏的思维中无法自拔。不知道自己为什么会有这种令人不齿的表现,更不知道这颗定时炸弹何时会将人炸的粉身碎骨。好在儒派宗师曾老夫子“吾日三省吾身”的名言警醒了我。遂潜心自省,溯源头以…

C++初阶入门之命名空间和缺省参数的详细解析

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.命名空间 2.1命名冲突的例子 2.2解决方案 2.3命…

MyBatis概述与MyBatis入门程序

MyBatis概述与MyBatis入门程序 一、MyBatis概述二、入门程序1.准备开发环境(1)准备数据库(2)创建一个maven项目 2.编写代码(1)打包方式和引入依赖(2)新建mybatis-config.xml配置⽂件…

node.js(nest.js控制器)学习笔记

nest.js控制器: 控制器负责处理传入请求并向客户端返回响应。 为了创建基本控制器,我们使用类和装饰器。装饰器将类与所需的元数据相关联,并使 Nest 能够创建路由映射(将请求绑定到相应的控制器)。 1.获取get请求传参…

祖传代码里的神逻辑

昨天做权限限制的需求,给自己配置了两个新的分组,然后就发现登录不了项目了,sql报错ORA-01795: maximum number of expressions in a list is 1000,一路debugger找到了元凶,看逻辑是想把两个不同表里的分组去重然后合并…