在ECMAScript6中,iterator是一个带有next()
方法的对象,它返回一个具有两个属性的对象:{value, done}
。 E.g:
function createIterator(ra) {
let i = 0;
return {
next() {
if (i < ra.length)
return {value: ra[i++],
done: false};
else
return {value: undefined,
done: true};
}
};
}
创建一个迭代器之后,人们发现它本身并没有多大用处,因为没有内置语法可以利用迭代器。相反,必须做以下事情:
const it = createIterator(['a', 'b', 'c']);
while (true) {
const o = it.next();
if (o.done)
break;
else
console.log(o.value);
}
&#34;可迭代&#34;另一方面,是一个具有Symbol.iterator
属性的对象,该属性必须是一个返回迭代器的无参数函数:
function createIterable(ra) {
let it = createIterator(ra);
return {
[Symbol.iterator]() {return it;}
};
}
...当我们创建一个iterable时,我们终于能够使用for of
语法:
for (let v of createIterable(['a', 'b', 'c']))
console.log(v);
查看上面的代码,&#34; iterable&#34;的附加值&#34; iterator&#34;上的对象不容易察觉。那么为什么Javascript需要这两个独立的iterable和iterator概念呢?顺便说一句,这就是Java does as well所以必须有一些与语言无关的理由,为什么有这两个不同的概念是个好主意。