Comments (6)
非常谢谢看得这么仔细。您指出的地方,基本都是我的错误,已经改正了。
目前,我将 Iterator 译为“遍历器接口”,可能译为“Iterator 协议”更好。
只要数据结构支持这个接口,就称为“可遍历”(iterator)。
该接口对应的是一个函数,调用该函数会返回一个 Iterator 对象,我译为“遍历器对象”。该对象代表一个指针,也就是 IteratorResult 。
from es6tutorial.
👍
from es6tutorial.
from es6tutorial.
阮老师,我觉得JavaScript的Iterable,Iterator,IteratorResult三个接口可以和Java中的java.lang.Iterable,java.util.Iterator 两个接口做个类比。其它一些语言也有类似的实现。
java.lang.Iterable 接口
public interface Iterable<T> {
Iterator<T> iterator();
}
java.util.Iterator 接口
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
Java中实现Iterable接口可以使对象成为 "foreach" 语句的目标。像HashSet,ArrayList等类都实现了这个接口。于是就可以这样去遍历Set:
Set<String> set = new HashSet<String>();
for (String s: set){}
虽然JavaScript中没有像ES6中加入class一样加入interface关键字,但是有类似的概念,JavaScript中的接口就是对某一组属性的描述,只要一个对象具有某个接口描述的所有属性就可以称其实现了这个接口。
而JavaScript中的 Iterable 和 Iterator两个接口和Java中是十分相似的,Iterable接口和Java的java.lang.Iterable接口一样只包含一个方法[Symbol.iterator]
,这个方法返回一个实现了Iterator接口的对象,而只要实现了这个接口,就可以用于for-of
语句。JavaScript中的 Iterator接口必须有一个next方法,这个方法和Java中java.util.Iterator接口的next方法类似,只是前者用next方法返回的IteratorResult对象的done属性判断是否遍历完了,而Java中的接口使用hasNext方法判断。
由此可以看出JavaScript和Java中Iterable接口很相似,实现了该接口的对象都可以在一种for-each机制中使用,而且都包含有功能类似的方法。Iterator接口也很相似,都提供了基本的next方法,用于迭代下一项。
最后,作比较是想说如果更明确的说明Iterable,Iterator,IteratorResult接口的话,可以让人看后更清晰一些,知道个来龙去脉,阮老师在文中的不同场景中多次使用了遍历器、指针这样的概念,容易让人搞不清概念。
创建一个指针,指向当前数据结构的起始位置。也就是说,遍历器的返回值是一个指针对象。
这里遍历器就是指Iterable的[Symbol.iterator]
方法了,而指针对象就是Iterator对象了。
完全可以写出没有对应数据结构的遍历器
根据后面的例子,我理解这里的遍历器是指实现了Iterator接口的对象了。
凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。
这里遍历器又指Iterable接口了
没有明确的说明Iterable,Iterator,IteratorResult接口而都用遍历器、指针来描述,感觉有点混乱。
最近,我总结整理了《JavaScript 高级程序设计》和 您的《ECMAScript 6入门》两本书的一些笔记,在整理这一部分的时候感觉比较困惑,所以整理时加进了三个接口的概念,并且用不同的表述代替了遍历器这种表述,感觉这样似乎可以清晰些了。
关于Iterator的译法,Java里译作迭代器,一些语言貌似也有相同的译法,如果别的语言中已经有了通用的译法,我觉得可以借鉴过来,也容易被理解接受。
最后,非常感谢阮老师开源了这本书,从中受益颇多。
from es6tutorial.
模块那一章,我看到您现在把console.log(exp(math.pi));
中的pi改为了PI,但是circle和circleplus都没有看到这个变量,倒是Math有这个。是不是该是变量e。
from es6tutorial.
谢谢指出我用法上的混乱,这部分,我确实没考虑清楚。
经过你的梳理,我现在的想法如下。
(1)一个数据结构只要有Symbol.iterator
属性,就称为“可遍历”(iterable)。
(2)Symbol.iterator
属性的值等于一个函数,可以称为“遍历器生成函数”。
(3)调用“遍历器生成函数”(Symbol.iterator
方法),会返回一个遍历器(iterator)
(4)这个遍历器是一个对象,相当于指针对象,调用它的Next方法,就可以移动指针。
我会根据上面的理解,修改原文。
至于math.PI
,我只是想举个例子,引用Math对象的属性,使用math.E
也可以。
from es6tutorial.
Related Issues (20)
- 页面无内容 HOT 1
- es6文档显示不了了 HOT 1
- 找不到网页内容 HOT 1
- edge 显示 file not found HOT 1
- Proxy章节描述错误 HOT 1
- 如果按照文档所说,协程应该是并发执行的,期望解读 HOT 1
- 18、Iterator 和 for...of 循环 HOT 1
- 每年新增的属性可以有一个列表,之后链接到对应的文章么 HOT 1
- Module 的语法 HOT 1
- 请问哪个js环境支持simd HOT 1
- Generator 的语法一章的wrapper包装例子是不是可以简化 HOT 1
- 建议「Module 的语法」这章里可以增加一个说明,就是:“export 可以输出什么”
- 关于Promise.resolve()是在本轮“事件循环”(event loop)的结束时执行,还是在下一轮“事件循环”的开始时的疑问 HOT 1
- array grouyBy是写错了么 HOT 2
- 关于 WeakSet WeakMap 的使用表现与文档不一致的问题 HOT 3
- Promise 对象一章关于 finally 的实现的问题 HOT 1
- 关于装饰器章节这个说法的疑问:「装饰器对类的行为的改变,是代码编译时发生的,而不是在运行时」 HOT 1
- 对象的Symbol.toStringTag属性,指向一个方法。这句“指向一个方法”是否是错误呢? HOT 1
- https://es6.ruanyifeng.com/#docs/proxy 中容易引起误解的部分
- 文档中的链接需要更新,原链接已经404 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from es6tutorial.