1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

docs(iterator): edit NodeList's iterator interface

This commit is contained in:
ruanyf 2017-08-07 11:35:01 +08:00
parent 3b8baf234b
commit 1a21fb8ea1

View File

@ -139,6 +139,7 @@ ES6 的有些数据结构原生具备 Iterator 接口(比如数组),即不
- String
- TypedArray
- 函数的 arguments 对象
- NodeList 对象
下面的例子是数组的`Symbol.iterator`属性。
@ -156,7 +157,7 @@ iter.next() // { value: undefined, done: true }
对于原生部署 Iterator 接口的数据结构,不用自己写遍历器生成函数,`for...of`循环会自动遍历它们。除此之外,其他数据结构(主要是对象)的 Iterator 接口,都需要自己在`Symbol.iterator`属性上面部署,这样才会被`for...of`循环遍历。
对象Object之所以没有默认部署 Iterator 接口是因为对象的哪个属性先遍历哪个属性后遍历是不确定的需要开发者手动指定。本质上遍历器是一种线性处理对于任何非线性的数据结构部署遍历器接口就等于部署一种线性转换。不过严格地说对象部署遍历器接口并不是很必要因为这时对象实际上被当作Map结构使用ES5 没有 Map 结构,而 ES6 原生提供了。
对象Object之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用ES5 没有 Map 结构,而 ES6 原生提供了。
一个对象如果要具备可被`for...of`循环调用的 Iterator 接口,就必须在`Symbol.iterator`的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。
@ -263,7 +264,9 @@ NodeList.prototype[Symbol.iterator] = [][Symbol.iterator];
[...document.querySelectorAll('div')] // 可以执行了
```
下面是类似数组的对象调用数组的`Symbol.iterator`方法的例子。
NodeList 对象是类似数组的对象,本来就具有遍历接口,可以直接遍历。上面代码中,我们将它的遍历接口改成数组的`Symbol.iterator`属性,可以看到没有任何影响。
下面是另一个类似数组的对象调用数组的`Symbol.iterator`方法的例子。
```javascript
let iterable = {