ES6学习——迭代器(Iterators):接口规范概述
2016-01-20 08:55
288 查看
这篇文章我们仔细看一下ES6规范中是如何定义Iterator的接口,在25.1章节中:
@@iterator属性可以用Symbol.iterator表示,上面的意思是说一个对象要想是iterable的,必须有个函数,名字叫Symbol.iterator,这个函数需要返回一个对象,并且这个对象符合Iterator接口,那么Iterator接口怎么定义的呢?
Iterator接口的意思就是说:符合Iterator接口的对象里需要有一个叫next的函数,这个函数需要返回一个对象,并且这个对象符合IteratorResult接口规范。继续往下看IteratorResult如何定义的:
IteratorResult接口里面定义了两个属性,一个是done,代表迭代是否已经完成。另一个属性value代表迭代过程中产生的值。
上面都是语言描述的形式,下面看看伪代码形式:
Iterator接口还有两个可选的方法,上面都给忽略了,以后会有文章专门介绍。
看个例子,如何实现这些接口:
*以上全部代码在Chrome 47下通过测试
@@iterator属性可以用Symbol.iterator表示,上面的意思是说一个对象要想是iterable的,必须有个函数,名字叫Symbol.iterator,这个函数需要返回一个对象,并且这个对象符合Iterator接口,那么Iterator接口怎么定义的呢?
Iterator接口的意思就是说:符合Iterator接口的对象里需要有一个叫next的函数,这个函数需要返回一个对象,并且这个对象符合IteratorResult接口规范。继续往下看IteratorResult如何定义的:
IteratorResult接口里面定义了两个属性,一个是done,代表迭代是否已经完成。另一个属性value代表迭代过程中产生的值。
上面都是语言描述的形式,下面看看伪代码形式:
interface Iterable { [System.iterator]() : Iterator; } interface IteratorResult { value: any; done: boolean; } interface Iterator { next() : IteratorResult; }
Iterator接口还有两个可选的方法,上面都给忽略了,以后会有文章专门介绍。
看个例子,如何实现这些接口:
function iterateOver(...args) {//rest操作符 let index = 0; let iterable = {//返回对象,对象里面需要有一个叫Symbol.iterator的函数 [Symbol.iterator]() { let iterator = {//Symbol.iterator需要返回一个对象,实现next方法 next() { if (index < args.length) { return { value: args[index++] };//返回符合IteratorResult接口的对象 } else { return { done: true };//返回符合IteratorResult接口的对象 } } }; return iterator; } } return iterable; } for (let x of iterateOver('fee', 'fi', 'fo', 'fum')) { console.log(x); }
*以上全部代码在Chrome 47下通过测试
相关文章推荐
- 221,多线程基础
- 自定义控件时初始调用initWithXXXX的一般情况(oc)
- Android插件实例——360 DroidPlugin详解
- POJ 1661 Help Jimmy
- 论“使用C++非内置全局变量的风险”
- WebStorm的REST client使用
- java tomcat中<context> docBase属性是什么意思?
- oracle如何杀除正在运行的进程
- 微信红包外挂?只是你不知道
- Log4j定时打印日志及添加模块名配置的Java代码实例
- 通过电机编码器AB相输出确定电机转向
- 在 Android* 商务应用中实施地图和地理围栏特性
- Dat2Rin.exe + runpkr00.exe 将*.T0* 数据转换成Rinex文件
- Java 教程
- 美团Android资源混淆保护实践
- 数据持久化
- Mac版本Android SDK无法更新问题解决
- window删除文件时提示: 源文件名长度大于系统支持的长度
- win2003安装.NET Framework 3.5报错
- Android流式布局实现