mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-25 11:12:21 +00:00
78 lines
1.6 KiB
Markdown
78 lines
1.6 KiB
Markdown
# Iterator:遍历器
|
||
|
||
遍历器(Iterator)是一种协议,任何对象只要部署这个协议,就可以完成遍历操作。在ES6中,遍历操作特指for...of循环。
|
||
|
||
ES6的遍历器协议规定,部署了next方法的对象,就具备了遍历器功能。next方法必须返回一个包含value和done两个属性的对象。其中,value属性是当前遍历位置的值,done属性是一个布尔值,表示遍历是否结束。
|
||
|
||
```javascript
|
||
|
||
function makeIterator(array){
|
||
var nextIndex = 0;
|
||
|
||
return {
|
||
next: function(){
|
||
return nextIndex < array.length ?
|
||
{value: array[nextIndex++], done: false} :
|
||
{value: undefined, done: true};
|
||
}
|
||
}
|
||
}
|
||
|
||
var it = makeIterator(['a', 'b']);
|
||
|
||
it.next().value // 'a'
|
||
it.next().value // 'b'
|
||
it.next().done // true
|
||
|
||
```
|
||
上面代码定义了一个makeIterator函数,它的作用是返回一个遍历器对象,用来遍历参数数组。请特别注意,next返回值的构造。
|
||
|
||
下面是一个无限运行的遍历器例子。
|
||
|
||
```javascript
|
||
|
||
function idMaker(){
|
||
var index = 0;
|
||
|
||
return {
|
||
next: function(){
|
||
return {value: index++, done: false};
|
||
}
|
||
}
|
||
}
|
||
|
||
var it = idMaker();
|
||
|
||
it.next().value // '0'
|
||
it.next().value // '1'
|
||
it.next().value // '2'
|
||
// ...
|
||
|
||
```
|
||
|
||
一个对象只要具备了next方法,就可以用for...of循环遍历它的值。
|
||
|
||
```javascript
|
||
|
||
for (var n of it) {
|
||
if (n > 5)
|
||
break;
|
||
console.log(n);
|
||
}
|
||
|
||
```
|
||
在ES6中,数组本身就具有iterator接口。
|
||
|
||
```javascript
|
||
|
||
const arr = ['red', 'green', 'blue'];
|
||
|
||
for(let v of arr) {
|
||
console.log(v);
|
||
}
|
||
\\ red
|
||
\\ green
|
||
\\ blue
|
||
|
||
```
|