Skip to content

Commit 1a21fb8

Browse files
committed
docs(iterator): edit NodeList's iterator interface
1 parent 3b8baf2 commit 1a21fb8

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

docs/iterator.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ ES6 的有些数据结构原生具备 Iterator 接口(比如数组),即不
139139
- String
140140
- TypedArray
141141
- 函数的 arguments 对象
142+
- NodeList 对象
142143

143144
下面的例子是数组的`Symbol.iterator`属性。
144145

@@ -156,7 +157,7 @@ iter.next() // { value: undefined, done: true }
156157

157158
对于原生部署 Iterator 接口的数据结构,不用自己写遍历器生成函数,`for...of`循环会自动遍历它们。除此之外,其他数据结构(主要是对象)的 Iterator 接口,都需要自己在`Symbol.iterator`属性上面部署,这样才会被`for...of`循环遍历。
158159

159-
对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作Map结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。
160+
对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。
160161

161162
一个对象如果要具备可被`for...of`循环调用的 Iterator 接口,就必须在`Symbol.iterator`的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。
162163

@@ -263,7 +264,9 @@ NodeList.prototype[Symbol.iterator] = [][Symbol.iterator];
263264
[...document.querySelectorAll('div')] // 可以执行了
264265
```
265266

266-
下面是类似数组的对象调用数组的`Symbol.iterator`方法的例子。
267+
NodeList 对象是类似数组的对象,本来就具有遍历接口,可以直接遍历。上面代码中,我们将它的遍历接口改成数组的`Symbol.iterator`属性,可以看到没有任何影响。
268+
269+
下面是另一个类似数组的对象调用数组的`Symbol.iterator`方法的例子。
267270

268271
```javascript
269272
let iterable = {

0 commit comments

Comments
 (0)