es6 Iterator(迭代器)的概念
Iterator(迭代器)的概念
JavaScript 原有的表示“集合”的数据结构,主要是数组(Array
)和对象(Object
),ES6 又添加了Map
和Set
。这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map
,Map
的成员是对象。这样就需要一种统一的接口机制,来处理所有不同的数据结构。
迭代器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
Iterator 的作用有三个:一是为各种数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按某种次序排列;三是 ES6 创造了一种新的遍历命令for...of
循环,Iterator接口主要供for...of
消费。
Iterator 的遍历过程是这样的。
(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,迭代器对象本质上,就是一个指针对象。
(2)第一次调用指针对象的next
方法,可以将指针指向数据结构的第一个成员。
(3)第二次调用指针对象的next
方法,指针就指向数据结构的第二个成员。
(4)不断调用指针对象的next
方法,直到它指向数据结构的结束位置。
每一次调用next
方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含value
和done
两个属性的对象。其中,value
属性是当前成员的值,done
属性是一个布尔值,表示遍历是否结束。
下面是一个模拟next
方法返回值的例子。
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
上面代码定义了一个makeIterator
函数,它是一个迭代器生成函数,作用就是返回一个迭代器对象。对数组['a', 'b']
执行这个函数,就会返回该数组的迭代器对象(即指针对象)it
。
指针对象的next
方法,用来移动指针。开始时,指针指向数组的开始位置。然后,每次调用next
方法,指针就会指向数组的下一个成员。第一次调用,指向a
;第二次调用,指向b
。
next
方法返回一个对象,表示当前数据成员的信息。这个对象具有value
和done
两个属性,value
属性返回当前位置的成员,done
属性是一个布尔值,表示遍历是否结束,即是否还有必要再一次调用next
方法。
总之,调用指针对象的next
方法,就可以遍历事先给定的数据结构。
对于迭代器对象来说,done: false
和value: undefined
属性都是可以省略的,因此上面的makeIterator
函数可以简写成下面的形式。
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++]} :
{done: true};
}
};
}
由于 Iterator 只是把接口规格加到数据结构之上,所以,迭代器与它所遍历的那个数据结构,实际上是分开的,完全可以写出没有对应数据结构的迭代器对象,或者说用迭代器对象模拟出数据结构。下面是一个无限运行的迭代器对象的例子。
var it = idMaker();
it.next().value // '0'
it.next().value // '1'
it.next().value // '2'
// ...
function idMaker() {
var index = 0;
return {
next: function() {
return {value: index++, done: false};
}
};
}
上面的例子中,迭代器生成函数idMaker
,返回一个迭代器对象(即指针对象)。但是并没有对应的数据结构,或者说,迭代器对象自己描述了一个数据结构出来。
如果使用 TypeScript 的写法,迭代器接口(Iterable)、指针对象(Iterator)和next
方法返回值的规格可以描述如下。
interface Iterable {
[Symbol.iterator]() : Iterator,
}
interface Iterator {
next(value?: any) : IterationResult,
}
interface IterationResult {
value: any,
done: boolean,
}
es6 Iterator(迭代器)的概念相关推荐
- ES6 iterator 迭代器
iterator使用TypeScript 的描述: interface Iterable { [Symbol.iterator]() : Iterator, } interface Iterator ...
- ES6 iterator 迭代器
iterator使用TypeScript 的描述: interface Iterable {[Symbol.iterator]() : Iterator, }interface Iterator {n ...
- ES6高级:扩展运算符,箭头函数,class类,iterator迭代器
2. 扩展运算符 ... 2.1 reset参数 reset参数==必须放在最后==,为了替代arguments,在函数形参中使用,==接受剩余参数==,以==数组==的形式去接受 //1. rese ...
- vector容器与iterator迭代器
vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库负责管理存储元素的相关内存.我们把vector称为容器,是因为它可以包含其他对象 ...
- JavaSE Collections类 , Iterator迭代器 , 增强for循环
Collections 它是集合的工具类,为集合体系扩展了一些其他的方法.类中都是静态的方法,可以使用类名直接调用. 可变参数 在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类 ...
- 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型
文章目录 Collection集合 集合概述 java.util.Collection接口 Iterator迭代器 Iterator接口 Iterator接口的常用方法 说明 迭代器实现原理图: 增强 ...
- 重学JavaSE —— Map、Set、Iterator(迭代器) 简单笔记
前言 本文是学习笔记,也有配套源码实例,主要是针对本人对Map.Set.Iterator进行的简单学习和笔记总结. 本文源代码已上传至Gitee:https://gitee.com/da-ji/ful ...
- 2.Collection、Iterator迭代器、泛型、斗地主案例
Collection集合 1.1 集合概念及其与数组的区别 集合:集合是java中提供的一种容器,可以用来存储多个数据. 与数组的区别 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型 ...
- Java基础知识(二)(Object类的常用方法、日期时间类、System类、StringBuilder类、包装类、Collection集合、Iterator迭代器、泛型、list集Set接口...)
文章目录 Java基础知识(二) 1.Object类的常用方法 1.1 toString方法 1.2 equals方法 1.3 Objects类 2.日期时间类 2.1 Date类 2.2 DateF ...
- ES6(迭代器、Set、Map、数组去重)
目录 迭代器Iterator Iterator 的作用 原生具备 Iterator 接口的数据结构 Iterator 的遍历过程 迭代器实现了Iterator接口,只要实现了Iterator就可以使用 ...
最新文章
- 树上问题 ---- E. Fib-tree(斐波那契数的性质 + 暴力模拟 + 认真计算复杂度)
- windows 安装 spark 及 pycharm 调试 TopN 实例
- c#编译器对byte类型的一些规则 (转)
- MySQL带IN关键字的子查询
- Angular Component的默认changeDetection策略
- python configparser 注释_使用configpar添加注释
- 创建启动oracle快捷方式,GNOME3创建连接OracleFS管理软件启动快捷方式
- python基础课程2(看代码看注释)--条件判断|循环|函数|生成器|类
- Protobuf生成Java代码(命令行)
- java改变表格标题,DIV 常用标题表格
- C++之指针探究(六):二级指针和指针数组
- Frequently Asked Questions — Scrapy 0.15.1 documentation
- ZABBIX 3.2 基础安装
- ajax只请求一次,关于ajax的请求只处理一次的问题
- 《Flutter 从0到1构建大前端应用》读后感—第7章【路由】
- 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例38
- 华为HCIE之TS部分整理
- 如何用python计算年龄_python 实现年龄计算程序
- java ajax教程_JAVA AJAX教程第三章—AJAX详细讲解
- python实现等量随机分组