@@ -12,13 +12,13 @@ Iterator的遍历过程是这样的。
12
12
13
13
(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
14
14
15
- (2)第一次调用指针对象的next方法 ,可以将指针指向数据结构的第一个成员。
15
+ (2)第一次调用指针对象的 ` next ` 方法 ,可以将指针指向数据结构的第一个成员。
16
16
17
- (3)第二次调用指针对象的next方法 ,指针就指向数据结构的第二个成员。
17
+ (3)第二次调用指针对象的 ` next ` 方法 ,指针就指向数据结构的第二个成员。
18
18
19
- (4)不断调用指针对象的next方法 ,直到它指向数据结构的结束位置。
19
+ (4)不断调用指针对象的 ` next ` 方法 ,直到它指向数据结构的结束位置。
20
20
21
- 每一次调用next方法 ,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含value和done两个属性的对象 。其中,value属性是当前成员的值,done属性是一个布尔值 ,表示遍历是否结束。
21
+ 每一次调用 ` next ` 方法 ,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含 ` value ` 和 ` done ` 两个属性的对象 。其中,` value ` 属性是当前成员的值, ` done ` 属性是一个布尔值 ,表示遍历是否结束。
22
22
23
23
下面是一个模拟next方法返回值的例子。
24
24
@@ -41,13 +41,28 @@ function makeIterator(array){
41
41
}
42
42
```
43
43
44
- 上面代码定义了一个makeIterator函数 ,它是一个遍历器生成函数,作用就是返回一个遍历器对象。对数组` ['a', 'b'] ` 执行这个函数,就会返回该数组的遍历器对象(即指针对象)it 。
44
+ 上面代码定义了一个 ` makeIterator ` 函数 ,它是一个遍历器生成函数,作用就是返回一个遍历器对象。对数组` ['a', 'b'] ` 执行这个函数,就会返回该数组的遍历器对象(即指针对象)` it ` 。
45
45
46
- 指针对象的next方法 ,用来移动指针。开始时,指针指向数组的开始位置。然后,每次调用next方法 ,指针就会指向数组的下一个成员。第一次调用,指向a ;第二次调用,指向b 。
46
+ 指针对象的 ` next ` 方法 ,用来移动指针。开始时,指针指向数组的开始位置。然后,每次调用 ` next ` 方法 ,指针就会指向数组的下一个成员。第一次调用,指向 ` a ` ;第二次调用,指向 ` b ` 。
47
47
48
- next方法返回一个对象 ,表示当前数据成员的信息。这个对象具有value和done两个属性,value属性返回当前位置的成员,done属性是一个布尔值 ,表示遍历是否结束,即是否还有必要再一次调用next方法 。
48
+ ` next ` 方法返回一个对象 ,表示当前数据成员的信息。这个对象具有 ` value ` 和 ` done ` 两个属性, ` value ` 属性返回当前位置的成员, ` done ` 属性是一个布尔值 ,表示遍历是否结束,即是否还有必要再一次调用 ` next ` 方法 。
49
49
50
- 总之,调用指针对象的next方法,就可以遍历事先给定的数据结构。
50
+ 总之,调用指针对象的` next ` 方法,就可以遍历事先给定的数据结构。
51
+
52
+ 对于遍历器对象来说,` done: false ` 和` value: undefined ` 属性都是可以省略的,因此上面的` makeIterator ` 函数可以简写成下面的形式。
53
+
54
+ ``` javascript
55
+ function makeIterator (array ){
56
+ var nextIndex = 0 ;
57
+ return {
58
+ next : function (){
59
+ return nextIndex < array .length ?
60
+ {value: array[nextIndex++ ]} :
61
+ {done: true };
62
+ }
63
+ }
64
+ }
65
+ ```
51
66
52
67
由于Iterator只是把接口规格加到数据结构之上,所以,遍历器与它所遍历的那个数据结构,实际上是分开的,完全可以写出没有对应数据结构的遍历器对象,或者说用遍历器对象模拟出数据结构。下面是一个无限运行的遍历器对象的例子。
53
68
@@ -70,9 +85,9 @@ function idMaker(){
70
85
}
71
86
```
72
87
73
- 上面的例子中,遍历器生成函数idMaker ,返回一个遍历器对象(即指针对象)。但是并没有对应的数据结构,或者说,遍历器对象自己描述了一个数据结构出来。
88
+ 上面的例子中,遍历器生成函数 ` idMaker ` ,返回一个遍历器对象(即指针对象)。但是并没有对应的数据结构,或者说,遍历器对象自己描述了一个数据结构出来。
74
89
75
- 在ES6中,有些数据结构原生具备Iterator接口(比如数组),即不用任何处理,就可以被for ...of循环遍历 ,有些就不行(比如对象)。原因在于,这些数据结构原生部署了Symbol.iterator属性 (详见下文),另外一些数据结构没有。凡是部署了Symbol.iterator属性的数据结构 ,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。
90
+ 在ES6中,有些数据结构原生具备Iterator接口(比如数组),即不用任何处理,就可以被 ` for ...of ` 循环遍历 ,有些就不行(比如对象)。原因在于,这些数据结构原生部署了 ` Symbol.iterator ` 属性 (详见下文),另外一些数据结构没有。凡是部署了 ` Symbol.iterator ` 属性的数据结构 ,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。
76
91
77
92
如果使用TypeScript的写法,遍历器接口(Iterable)、指针对象(Iterator)和next方法返回值的规格可以描述如下。
78
93
0 commit comments