遍历器 Iterator
遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)
Iterator 的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是 ES6 创造了一种新的遍历命令for…of循环,Iterator 接口主要供for…of消费。
Iterator 的遍历过程是这样的。
(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。
每一次调用next方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,并且如果Symbol.iterator方法对应的不是遍历器生成函数,会报错
原生具备 Iterator 接口的数据结构如下。
Array
Map
Set
String
TypedArray
函数的 arguments 对象
NodeList 对象
我们可以把数组的Symbol.iterator属性赋给类数组,再用扩展运算符,实现类数组转数组
之前写过自己实现Iterator接口
Object.defineProperty(myObject, Symbol.iterator, {enumerable: false,writable:false,configurable:false,value:function(){let o = this;let idx = 0;let ks = Object.keys(o);return {next:function(){return {value:o[ks[idx++]],done:(idx>ks.length)}}}}
});
其实还有一种更简单粗暴的实现方式,用Generator 函数
let myIterable = {[Symbol.iterator]: function* () {yield 1; //根据情况写表达式yield 2;yield 3;}
}
[...myIterable] // [1, 2, 3]
遍历器next方法最重要,但除了它还有return和throw方法,return方法的使用场合是,如果for…of循环提前退出(通常是因为出错,或者有break语句或continue语句),就会调用return方法。如果一个对象在完成遍历前,需要清理或释放资源,就可以部署return方法。
function readLinesSync(file) {return {[Symbol.iterator]() {return {next() {return { done: false };},return() {file.close();return { done: true };}};},};
}
//触发return
// 情况一 输出文件的第一行以后,就会执行return方法,关闭这个文件
for (let line of readLinesSync(fileName)) {console.log(line);break;
}// 情况二 输出所有行以后,执行return方法,关闭该文件
for (let line of readLinesSync(fileName)) {console.log(line);continue;
}// 情况三 会在执行return方法关闭文件之后,再抛出错误
for (let line of readLinesSync(fileName)) {console.log(line);throw new Error();
}
ES6 的数组、Set、Map 都部署了以下三个方法,调用后都返回遍历器对象(Object.keys等与他们不同,返回的是数组)
entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组。
keys() 返回一个遍历器对象,用来遍历所有的键名。
values() 返回一个遍历器对象,用来遍历所有的键值。
遍历器 Iterator相关推荐
- js的遍历器(Iterator)
js的遍历器(Iterator)是什么 JavaScript 原有的表示"集合"的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有 ...
- es6 迭代器(遍历器)Iterator 自定义遍历器 lterator/简单模拟values方法 for of运行机制 Array/Set/Map默认迭代器接口 对象设置迭代器
文章目录 迭代器 Iterator 用处 (需要自定义遍历数据的时候) 自定义 遍历器 lterator 简单模拟values方法 Array Set Map 默认迭代器接口 entries valu ...
- ES6之遍历器Iterator
目录 一.什么是遍历器 二.如何部署遍历器 三.遍历器的应用 1. 解构赋值 2. 扩展运算符 3. Iterator与Generator函数 4. return和throw 总结 一.什么是遍历器 ...
- 第十四节:ES6的 Iterator 遍历器到底是什么?
对一个事物足够热爱,才会有这样的热情... 冲着这位同学的学习热情,前端君今晚就给大家再来一发. for...of为啥不遍历Object对象 第十三节我们讲了简单又实用的for...of,我们可以使用 ...
- Iterator遍历器和原生可遍历
1. Iterator遍历器 ①Iterator是一个遍历器(迭代器),是一个统一的遍历方式.Iterator寻找是找不到,该方法在对象原型链上可以找到,Symbol.iterator():调用该方法 ...
- Iterator 遍历器的简单使用
Object接口 实现Iterator 我们可以使用 ES6 的展开运算符 - 和 for-of- 去遍历带有 Iterator 接口的数据结构,需要注意的是,Object 本身不具备 Iterato ...
- 【ES6】Set Map数据结构、Iterator遍历器
Set() Set类似于数组,但是成员的值都是唯一的,没有重复的值.Set 本身是一个构造函数,用来生成 Set 数据结构. const s = new Set(); let arr = [2, 3, ...
- ES6 的遍历器接口 Iterator
一.概念 遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). Iterato ...
- iterator [ɪtə'reɪtə] 遍历器
lterator 遍历器 遍历器是一种接口,它为不同的数据结构提供了统一的访问机制. 如果一个数据结构具有遍历器接口,那么就可以依次处理该数据结构的成员. 当前 javascript 用来表示集合的数 ...
最新文章
- java显示本地磁盘所有盘符,显示桌面路径
- 三维等值面提取算法(Dual Contouring)
- 【分享】计算机视觉方向必备opencv基础知识总览
- web服务器和应用服务器的区别以及负载均衡---学习笔记
- python监听器_监听器 - python成长中 - 博客园
- Collections.sort()自定义排序方式
- 《标准库time、datetime、calendar、random的使用》
- 深入JS正则先行断言
- Java架构-高并发的解决实战总结方案
- Struts2 s:iterator 用法
- 舒尔补理论Schur Compliment
- 单线程实现同时监听多个端口(windows平台c++代码)
- 夜间灯光数据dn值_一种基于遥感夜间灯光数据和能源消耗统计数据的城市能耗量空间化方法与流程...
- 一个Python开源项目-腾讯哈勃沙箱源码剖析(上)
- 学习C语言的必备书籍-从入门到精通
- [150529](必看)档案挂靠与打回生源地、暂缓的对比 (广州)
- 一些免费在线杀毒网址
- KubernetsPod分析
- HTML Table之展开收起
- 猿创征文|GaussDB(for openGauss):基于 GaussDB 迁移、智能管理构建应用解决方案