ES6学习之路:迭代器Iterator和生成器Generator

news/2024/4/29 4:01:23/文章来源:https://blog.csdn.net/Code_King006/article/details/137005963

在这里插入图片描述

迭代器

一、知识背景

  1. 什么是迭代器
    迭代器就是在一个数据集合中不断取出数据的过程
  2. 迭代和遍历的区别
    • 遍历是把所有数据都取出
    • 迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列,就可以使用迭代器进行无限取值。
  3. 那么,什么是迭代器呢?
    对整个迭代过程的封装,不同的语言有不同的表现形式。通常是一个对象
  4. 迭代模式
    一个设计模式,用于统一迭代过程,并规范了迭代器规格
    • 迭代器应该具有得到下一个数据的能力
    • 迭代器应该具有判断是否还有后续数据的能力

二、ES6里的迭代器

JS中规定,如果一个对象具有next方法,并且该方法返回一个对象,则该对象的格式如下,则认为该对象是一个迭代器。

const obj={next(){retrun{value:xxx, // 值done:xxx// 是否迭代完成}}
}

在这里插入图片描述

  • next方法:用于得到下一批数据
  • 返回的对象
    • value:下一个数据的值
    • done:布尔值,是否完成迭代

三、迭代器创建函数

这个知识点分两个方面来分享 1. 迭代对象内置的迭代器创建函数 2.创建自定义的可迭代对象

3.1、 迭代对象内置的迭代器创建函数

首先,我们需要搞懂什么是迭代器创建函数?

  • ES6规定,如果一个对象具有知名符号属性 [Symbol.iterator],并且属性是一个迭代器创建函数,则该对象是可迭代的(iterable)

    • 迭代器(iterator):一个具有next方法的对象,next方法返回下一个数据并且能指示是否迭代完成
    • 迭代器创建函数(iterator create):一个返回迭代器的函数

js中的可迭代对象有很多,例如数组,集合,映射,类数组,字符串等,以数组为例

const arr=[1,3,4,5,6]console.log(arr)

在这里插入图片描述

执行数组中的迭代器

// 数组
const arr = [1, 2, 3, 4, 5];
// 数组中内置的迭代器创建函数
const iterator = arr[Symbol.iterator]()
// 执行迭代器
iterator.next()

在这里插入图片描述
执行类数组中的迭代器,例如 document.querySelectorAll

// 类数组内置的迭代器
const divs=document.querySelectorAll('div')
const iterator=divs[Sysbol.iterator]()
iterator.next() 

3.2、 普通对象自定义创建 迭代器创建函数

通常,我们使用for of 循环遍历可迭代对象

// 迭代完成后循环结束
for(const item in iterable){// iterable:可迭代对象// item 每次迭代得到的数据
}

可以发现,forof是无法遍历普通对象的,那是因为普通对象不是迭代对象,没有迭代器创建函数和[Symbol.iterator]属性,如果我把这个属性给它加上,普通对象是否会成为迭代对象,从而被forof遍历呢?

// 自定义的可迭代对象
var obj = {
a:1,
b:2,[Symbol.iterator]() {return {next() {return {value: 1,done: false}}}}
}
for(const item of obj){console.log(item)
}

在这里插入图片描述

在这里插入图片描述
结果发现,普通对象是可以通过添加迭代创建函数的方式成为迭代对象的,forof会不断的获取 迭代器中的value值,只要done不为false,就会一直无限取下去。

生成器

一、知识背景

  1. 什么是生成器?
    生成器是一个通过构造函数Generator创建的,也是一个对象,但是无法自己new,只能js引起内部去使用;生成器即是一个迭代器,同事也是一个迭代对象。

  2. 如何创建一个生成器?

    生成器的创建必须使用生成器函数 (Generator Function),返回的是一个生成器对象

  3. 如何书写一个生成器函数呢?

    // 这是一个生成器函数,该函数一定返回一个生成器function *method(){}function* method(){}{*method(){}}*methods=()=>{}
  4. 生成器函数是如何执行的?

    • 生成器函数内部是给生成器每次迭代提供数据的,生成的数据需要放在yield后,才能被迭代出来

          function* test() {console.log('aaaa') }const generator = test()console.log(generator.next()) //  aaaa  { value: undefined, done: true }
      

      在这里插入图片描述

    • yield 是一个关键词,该关键词只能在生成函数的内部使用,意思是 “产生” 一个迭代数据

    • 每次调用生成器的next方法,生成器将运行到下一个yield的位置

      function* test() {console.log('第一次运行')yield 1; //产生的迭代数据console.log('第二次运行')yield 2;//产生的迭代数据console.log('第三次运行')}const generator = test()console.log(generator.next()) // 第一次运行 { value: 1, done: false }console.log(generator.next()) // 第二次运行 { value: 2, done: false }console.log(generator.next()) // 第三次运行 { value: undefined, done: true }
      
    • 生成器可以有返回值return 返回值出现在当迭代器next方法中的done为true时的 value中

      function* test() {console.log('第一次运行')yield 1; //产生的迭代数据console.log('第二次运行')yield 2;//产生的迭代数据console.log('第三次运行')return 10; //函数结束,迭代结束,所以迭代器第一次done为true 的value值可以为10 }const generator = test()console.log(generator.next()) // 第一次运行 { value: 1, done: false }console.log(generator.next()) // 第二次运行 { value: 2, done: false }console.log(generator.next()) // 第三次运行 { value: 10, done: true }console.log(generator.next()) /  { value: undefined, done: true }
      
    • 调用next(参数)方法传值,参数会传给第一次next后的yield,所以第一次调用next(),传参是没有意思的

         function* test() {let info = yield 1 // { value: 1, done: false }console.log(info) // 5info = yield 2 + info // { value: 7, done: false }console.log(info)}const generator = test()console.log(generator.next(111)) // { value: 1, done: false }console.log(generator.next(5)) // { value: 7, done: false }
      
    • 在生成器内部调用其他生成器的函数的迭代数据,注意调用时要加*

         fucntion *a(yield 'a'yield 'b')function *test(){// a() 返回一个生成器对象// yield a() 迭代一个生成器对象yield *a()yield 1yield 2yield 3} const generator = test()console.log(generator.next()) // { value: 'a', done: false } // 会先迭代a方法里的数据
      

二、 生成器常见的api使用方法

除了next方法,下面再接收两个用的比较多的方法

return方法

return方法,调用该方法,可以手动结束整个迭代,后面再次调用next方法时,value值为 undefined

	function* test() {yield 1yield 2yield 3}const generator = test()console.log(generator.next()) //  { value: 1, done: false }console.log(generator.return()) // { value: undefined, done: true }console.log(generator.next()) // { value: undefined, done: true }console.log(generator.next()) // { value: undefined, done: true }console.log(generator.next()) // { value: undefined, done: true }// return 也可以传参数console.log(generator.return(5)) // { value: 5, done: true }

throw方法

throw方法,调用该方法,可以手动抛出一个错误,从而阻止后面数据的迭代

function* test(){yield 1yield 2yield 3
}
const generator = test()
console.log(generator.next()) //  { value: 1, done: false }
console.log(generator.throw(new Error('123'))) // 在  yield 1 报错
console.log(generator.next()) // 不运行
console.log(generator.next()) // 不运行 

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

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

相关文章

linux nginx配置ssl, 实现https+ip访问

mkdir sslZhengShu openssl req -newkey rsa:2048 -nodes -keyout ca.key -out ca.csr openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr 和之前输入一样即可 …

Python基本运算

1.逻辑运算符 第四行会有黄色的下划线是因为这个不是系统推荐的写法,系统推荐的是第五行的链式比较; 2.短路求值 对于and而言,左边的语句是false,那么整体一定是false,右边的表达式就不会进行计算; 对于or而言&…

FTP 文件传输服务

FTP连接 控制连接:TCP 21,用于发送FTP命令信息 数据连接:TCP 20,用于上传、下载数据 数据连接的建立类型: 主动模式:服务端从 20 端口主动向客户端发起连接 被动模式:服务端在指定范围…

平台介绍-搭建赛事运营平台(3)

上文介绍了品牌隔离的基本原理,就是通过不同的前端和微服务来实现。但是确实很多功能是类似的,所以从编程角度还是有些管理手段的。 前端部分:前端部分没有什么特别手段,就是两个独立的项目工程,分别维护。相同的部分复…

神策数据参与制定首份 SDK 网络安全国家标准

国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告(2023 年第 13 号),全国信息安全标准化技术委员会归口的 3 项国家标准正式发布。其中,首份 SDK 国家标准《信息安全技术 移动互联网应用程序&#xff0…

2核4G服务器租用价格表,阿里云/腾讯云/华为云/京东云

当前最新2核4G云服务器多少钱?165元一年,30元3个月。阿里云2核4G服务器165元一年,30元3个月、腾讯云2核4G5M服务器165元一年、京东云2核4G云主机126元1年,华为云也提供2核4G配置云服务器。阿腾云atengyun.com整理2024年最新云服务…

【NLP笔记】预训练+Prompt Tuning新范式之LLM时代(GPT3...)

文章目录 概述GPT3 【参考链接】 一张图总结大语言模型的技术分类、现状和开源情况 大语言模型LLM微调技术:Prompt Tuning A Survey of Large Language ModelsThe Practical Guides for Large Language ModelsGPT3:Language Models are Few-Shot Learner…

行存储与列存储:大数据存储方案的选择与优缺点分析

随着大数据时代的来临,数据的规模和复杂性呈指数级增长,传统的关系数据库已经不再适应这一巨大的存储量和计算要求。在大数据存储领域,行存储和列存储成为两种备受关注的存储方案。本文将探讨行存储和列存储的定义、优缺点,并结合…

python pytz是什么

pytz模块常用于时区的转换,常常配合datetime一起使用。我们知道datetime除了data方法生成的时间是没有时区概念,其他如time、datetime等都是有时区概念,即指定了tzinfo信息。 >>> import datetime >>> datetime.datetime.n…

骗子查询系统源码

源码简介 小权云黑管理系统 V1.0 功能如下: 1.添加骗子,查询骗子 2.可添加团队后台方便审核用 3.在线反馈留言系统 4.前台提交骗子,后台需要审核才能过 5.后台使用光年UI界面 6.新增导航列表,可给网站添加导航友链 7.可添加云黑类…

C语言运算符和表达式——增1和减1运算符

目录 增1和减1运算符 一元运算符 前缀增1/减1运算符 后缀增1/减1运算符 前缀与后缀对变量和表达式的影响 稍微复杂一点的例子 增1和减1运算符的优缺点 增1和减1运算符 增1运算符(Increment) *使变量的值增加1个单位 减1运算符(Decre…

量化交易软件开发定制的步骤

量化交易软件的定制开发是一个复杂而精细的过程,需要经过一系列步骤来确保最终交付的软件符合客户的需求并具有高度的可靠性和效率。以下是量化交易软件开发定制的主要步骤: 1. 需求分析与规划 在开始开发之前,首先需要与客户深入沟通&…

【使用matlab绘制音频数据的时域图和频域图】

使用matlab绘制音频数据的时域图和频域图 虚拟的数据集见附件 一、读取数据并设置参数 close all;clear all;colordef black 设置参数 filedir D:\Projects\MATLAB\data name 2024-03-28.txt % disp(filedir);Fs 8192; %采样率,即单位时间的样本个数&#xff…

电脑如何更新AMD独立显卡驱动?安装官方驱动的方法来了!

前言 有小伙伴在电脑上安装了独立显卡之后,总会用驱动人生或者驱动精灵等软件给独立显卡安装驱动。这种安装方法并不能说是错的,反正能用就行。 安装官方驱动的办法其实很简单,现在独立显卡一共就那么几家,最常见的显卡就是Nvidi…

Java基于微信小程序的校园订餐小程序的实现,附源码和数据库

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月29日,星期五

每天一分钟,知晓天下事! 2024年3月29日 星期五 农历二月二十 1、 网络表演(直播与短视频)运营团体标准发布:应建立举报处置机制。 2、 商务部:中国决定终止对澳大利亚进口葡萄酒征收反倾销税和反补贴税。…

八大技术趋势案例(虚拟现实增强现实)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

android中控件和基本事件的响应

1.概述 在Android中,在处理UI中的各种元素的时候,两个程序中的要点为: 得到布局文件(XML)中的控件句柄 设置控件的行为 本篇文章将介绍在 Android 中几种基本的程序控制方法,要获得的效果是通过 2 个按钮来…

吴恩达机器学习:实践实验室-应用机器学习的建议(Advice for Applying )

在这个实验室中,您将探索评估和改进机器学习模型的技术。 文章目录 1 - Packages2-评估学习算法(多项式回归)2.1拆分数据集2.1.1图列、测试集 2.2模型评估的误差计算,线性回归2.3比较训练和测试数据的表现 3-偏差和方差3.1绘图列…

鸿蒙OpenHarmony技术:【设备互信认证】

简介 在OpenHarmony中,设备互信认证模块作为安全子系统的子模块,负责设备间可信关系的建立、维护、使用、撤销等全生命周期的管理,实现可信设备间的互信认证和安全会话密钥协商,是搭载OpenHarmony的设备进行可信互联的基础平台能…