惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
G
Google Developers Blog
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
F
Full Disclosure
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
Help Net Security
Help Net Security
The Hacker News
The Hacker News
IT之家
IT之家
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
博客园 - 聂微东
Hacker News: Ask HN
Hacker News: Ask HN
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Security Archives - TechRepublic
Security Archives - TechRepublic
Simon Willison's Weblog
Simon Willison's Weblog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Last Week in AI
Last Week in AI
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
Google DeepMind News
Google DeepMind News
Cloudbric
Cloudbric
N
News | PayPal Newsroom
A
About on SuperTechFans
S
Schneier on Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
雷峰网
雷峰网
T
The Exploit Database - CXSecurity.com
罗磊的独立博客
K
Kaspersky official blog
The Cloudflare Blog
I
Intezer

博客园 - herryLo

LangChainJs之基础模型(一) 什么是生成式AI 白嫖党体验Claude Code 关于Web GIS基础知识 直播流IOS无法播放问题排查 如何全方位提升博客站点? web前端pdf.js预览pdf实例创建报错:Array. prototype` contains unexpected enumerable properties Windows 10 专业版下推送docker镜像到harbor报错:x509: certificate relies on legacy Common Name field, use SANs instead A Philosophy of Software Design 软件设计哲学 浅读-《深入浅出Nodejs》 腾讯云对象存储 COS搭建个人网站 你知道,前端工程部署有哪些方式嘛? 2022前端开发知识总结归纳(前端掌握知识) 如何使用Docker构建前端项目 Rancher前端服务发布 知识扩展-SQL查询基础 Axios源码解析:请求响应拦截器 AntV G2可视化引擎, 有用过嘛? 🔥[译] 正交设计组件的好处 GitHub Action一键部署配置,值得拥有 小程序开发指南之性能优化
弄懂!ES6中的Iterator迭代器
herryLo · 2020-06-10 · via 博客园 - herryLo

本文云纹链接🔗

专门说一说Iterator迭代器的原因是,为后面async/await的文章做铺垫,因为我async/await是由Generator+Promise共同构成,而其中的Generator就是依赖于迭代器Iterator

下面让我们来看看什么是Iterator?它出现的目的是什么?如何使用它?

#Iterator迭代器

名词: 迭代 iteration / 可迭代 iterable / 迭代器 iterator

想必大家使用过for循环、while循环等,遍历Array获取其中的值,那其他数据结构如何通过遍历获取呢?或者这样说,是否可以提供一个统一的访问机制?来访问Object、Map、Set等。

轮到Iterator迭代器出场,Iterator迭代器就是为了解决这个问题,它提供统一的接口,为不同的数据结构提供统一的访问机制。(目前Map、Set、Array支持Iterator)。

顾名思义,Iterator迭代器的出现就是为了迭代而生,为不同的集合:Object、Array、Map、Set,提供了一个统一的接口(这里接口可以简单的理解为方法,就是遍历方法)。向我们常用的for...of就是依赖与Iterator迭代器。

在这里顺便提一嘴,我理解到的遍历、迭代的关系:遍历就是访问数据结构的所有元素,而迭代是遍历的一种形式。

上面的makeIterator函数,它就是一个迭代器生成函数,作用就是返回一个迭代器对象。对数组执行这个函数,就会返回该数组的迭代器对象it。

通过调用next函数,返回valuedone两个属性;value属性返回当前位置的成员,done属性是一个布尔值,表示遍历是否结束,即是否还有必要再一次调用next方法;当done为true时,即遍历完成。

小结:Iterator迭代器就是一个接口方法,它为不同的数据结构提供了一个统一的访问机制;使得数据结构的成员能够按某种次序排列,并逐个被访问。

#Iterator规范

在上面的代码中,迭代器对象it包含一个next() 方法,调用next()方法,返回两个属性:布尔值done和值value,value的类型无限制。

迭代器对象包含的属性我们知道了,那么在日常开发中,我们如何让一个对象成为一个可迭代对象呢?(可迭代对象即支持迭代器规范的对象)

要成为可迭代对象, 一个对象必须实现@@iterator方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为@@iterator的属性,可通过常量 Symbol.iterator 访问该属性。

myIterable对象添加Symbol.iterator属性,同时在返回的next方法中,添加两个属性,既让它成为了一个可迭代对象。(其实如果真的有这样的需求,可以考虑使用Map)。

小结:Iterator规范————Iterator迭代器包含一个next()方法,方法调用返回返回两个属性:donevalue;通过定义一个对象的Symbol.iterator属性,即可将此对象修改为迭代器对象,支持for...of遍历。

#IteratorGenerator

GeneratorPromise一样,都是提供异步编程解决方案。其实Generator函数就是一个普通函数,但是有两个特征,一是,function关键字与函数名之间有一个星号*;二是,函数内部使用yield表达式,定义不同的内部状态。来看看Generator函数的使用:

通过上面的例子可以知道,Generator函数执行后,会返回一个Iterator对象。在Generator中的yield表达式,yield会记住当前代码运行的状态和位置,等在调用这串代码的时候会依次往后走。

Iterator(迭代器)就是一个可迭代的对象,而Generator(生成器)使用了yield或者生成器表达式,生成iterator对象,用一种方便的方法实现了iterator,在for循环取数据或使用next()取数据.

小结:Generator(生成器)可以理解为是对Iterator(迭代器)的一种实现。

#Iterator应用

Generator(生成器)就是其中最典型的一个应用,当然还有其他,例如:Map、Set、Array等原生具备Iterator(迭代器),支持for...of循环。

#Obejct实现Iterator接口

Object对象虽然不支持Iterator(迭代器),但我们可以使用Generator(生成器)进行包装。

目前在Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象,原生具备Iterator接口。

参考:

阮一峰:Iterator 和 for...of 循环

MDN 迭代协议

白话解释 迭代器(ITERATOR)和生成器(GENERATOR)

Python/Iterator and Generator 关系