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:
parent
3b8baf234b
commit
1a21fb8ea1
@ -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 = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user