【发布时间】:2017-12-18 23:46:08
【问题描述】:
让我们假设具有定义迭代器的对象的两个类似实现:一个使用generators 的迭代器,另一个使用iterables。这两个都与Array.from 一起工作,并且都可以迭代。这两种方法有什么区别,首选哪一种,为什么?是否需要采用较小的方法?
class Foo {
constructor( ...args ) {
this.f = args;
}
[Symbol.iterator]() {
let c = 0;
const i = {
next: () => {
if ( c < this.f.length ) {
return {value:this.f[c++], done: false};
}
else {
return {value:undefined,done:true};
}
}
};
return i;
}
};
class Bar {
constructor( ...args ) {
this.f = args;
}
*[Symbol.iterator]() {
let c = 0;
if ( c < this.f.length ) {
yield this.f[c++];
}
else {
return;
}
}
};
在这里我们可以测试它们两者以证明它们本质上是相同的。
var o1 = new Foo([1,2,3]);
for ( let x of o1 ) {
console.warn(x)
}
console.log(o1, Array.from(o1));
var o2 = new Bar([1,2,3]);
for ( let x of o2 ) {
console.warn(x)
}
console.log(o2, Array.from(o2));
【问题讨论】:
-
对我来说,生成器只是创建迭代器的语法糖。当然,它是一种非常强大的语法糖,代码越复杂,因为您不必自己维护迭代器状态。就我个人而言,由于样板较少,我总是更喜欢生成器。
标签: javascript ecmascript-6 generator iterable