迭代器Iterator和生成器funcion *

news/2024/11/24 16:30:26/

迭代器Iterator

迭代器 为各种不同的数据结果提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成便利操作,主要提供for of
工作原理:
创建一个指针对象,指向当前数组的起始位置
第一次调用对象的next方法,会自动指向数据接口的第一个成员
接下来不断用next方法,指针会一直往后移动,直到指向最后一个成员
目前 数组 Set Map 字符串他们的原型上有Symbol.interator,表示可以进行迭代器
在这里插入图片描述
只要原型上有Symbol.iterator属性那么就能调用迭代器的next( ) 方法

object原型上是没有Symbol.iterator属性,因为javascript认为object可以直接通过调用key来获取对应的值,不存在顺序调用。

//数组
let arr = [12, 3, 4, 5, 6, 7]
let it = arr[Symbol.iterator]()
it.next() // 12
it.next() // 3
it.next() // 4
...
//Set
let set = new Set([1, 3, 4, 3, 7])
let seti = set[Symbol.iterator]()
seti.next() // 1
seti.next() // 3
seti.next() // 4
let map = new Map([['q', 1]['w', 2]])
let mapi = map[Symbol.iterator]()
mapi.next()

如何给对象添加Symbol.iterator,使他能够使用for of循环

// 需求:现在需要遍历这个对象 必须使用for of遍历,每次返回的是stus的成员 
const banjin = {name: 'yiban',stus: ['xiaoming','xiaogang','xiaohong','xiaowang']
}const banjin = {name: 'yiban',stus: ['xiaoming','xiaogang','xiaohong','xiaowang'],[Symbol.iterator]() {let index = 0let that = this // 让this指向当前对象,或者下面使用尖头函数return {next: function () {// return { value: '111', done: false }   // 如果这样些会一直输出,应为一直没有结束 if (index < that.stus.length) {index++ // 下标自增,不然index永远为0return { value: that.stus[index], done: false }} else {return { value: undefined, done: true }}}}}
}for (let i of banjin) {console.log(i); // 会提示:TypeError:banji is not iterate ,说明班级这个变量它不能迭代 
}

生成器函数

生成器是ES6中新增的一种函数控制、使用的方案,它可以让我们更加灵活的控制函数什么时候继续执行、暂停执行

生成器函数也是一个函数,但是和普通的函数有一些区别:
生成器函数需要在function的后面加一个符号:*
生成器函数可以通过yield关键字来控制函数的执行流程
生成器函数的返回值是一个Generator(生成器)

生成器事实上是一种特殊的迭代器

//普通生成器调用
function* foo() {yield console.log("01")yield console.log("02")yield console.log("03")
}
const fooi = foo()
fooi.next() // 01
fooi.next() // 02
fooi.next() // 03

生成器异步调用

//实现一个借接口请求 loading加载 异步请求数组 loading消失 加上上一次的结果作为下次的参数使用function pro1() {console.log('第一次调用loading'); 
}function pro2() {setTimeout(() => {console.log('第二次调用异步加载数据,加载成功之后在关闭loading');const num = 1000 // 比如这个请求成的结果参数 传到下个请求中proi.next(num)}, 2000);
}// x: 上一个请求获得结果作为参数传入
function pro3(x) {console.log('第三次调用关闭loadin',x); // 1000 
}function * pro() {pro1()let x = yield pro2()let y = yield pro3(x)
}
const proi = pro()
proi.next()

http://www.ppmy.cn/news/99488.html

相关文章

SpringCloudAlibaba整合分布式事务Seata

文章目录 1 整合分布式事务Seata1.1 环境搭建1.1.1 Nacos搭建1.1.2 Seata搭建 1.2 项目搭建1.2.1 项目示意1.2.2 pom.xml1.2.2.1 alibaba-demo模块1.2.2.2 call模块1.2.2.3 order模块1.2.2.4 common模块 1.2.3 配置文件1.2.3.1 order模块1.2.3.2 call模块 1.2.4 OpenFeign调用1…

shell编程lesson06

流控制 while 和 until 循环 #!/bin/bash# while-count:display a series of numbersi1 while [ $i -le 5 ];doecho $ii$((i1)) done echo "Finished!"while命令的语法结构如下&#xff1a; while commands;do commands;done 我们可以使用while循环改进上一节中的…

MKS SERVO4257D 闭环步进电机_系列4 MODBUS指令说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

剑指 Offer 14- I 剪绳子

题目&#xff1a; 给你一根长度为 n 的绳子&#xff0c;请把绳子剪成整数长度的 m 段&#xff08;m、n都是整数&#xff0c;n>1并且m>1&#xff09;&#xff0c;每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少&#xff1f;例如&am…

数据结构与算法04:队列

目录 什么是队列&#xff1f; 循环队列 双端队列 阻塞队列 队列的应用场景 每日一练 什么是队列&#xff1f; 在 上一篇文章 中讲述了栈&#xff1a;先进后出就是栈&#xff0c;队列刚好相反&#xff0c;先进先出的数据结构就是队列&#xff0c;还是拿纸箱子来举例&…

SpringBoot整合Swagger3.0

SpringBoot整合Swagger3.0 SpringBoot整合Swagger3.0 引入pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…

【chatGPT】使用ChatGPT进行工作提效

参加新星计划2023【使用ChatGPT进行工作提效】记录的写笔记&#xff01; 借助ChatGPT自动制作PPT&#xff1a;https://blog.csdn.net/Catherinemin/article/details/130846117 ChatgGPT生成Excel统计公式&#xff1a;https://blog.csdn.net/Catherinemin/article/details/13085…

DJ6-6/7 文件共享和访问控制、文件保护

目录 6.6 文件共享和访问控制 1、同时存取 2、存取权限 3、文件共享的实现 6.6.1 基于索引结点的共享方式 1、基本思想 2、具体操作 6.6.2 利用符号链接实现文件共享 6.6.3 利用 URL 实现文件共享 6.7 文件保护 6.6 文件共享和访问控制 文件共享的有效控制涉及…