假设我们有一个定制的可迭代对象,如下所示:
class MyIterable {
val = 1;
[Symbol.iterator]() {
return {
next: () => {
return {
done: this.val > 3,
value: this.val++
}
}
}
}
}
for(const v of new MyIterable()){
console.log(v);
}
我的第一个问题是--有没有办法每次都给next()方法传递一个新的值?
class MyIterable {
val = 1;
[Symbol.iterator]() {
return {
next: (a,b,c) => { // pass a,b,c
return {
done: this.val > a,
value: this.val + b + c
}
}
}
}
}
然后用for..of
传递a,b,c
:
let [a, b, c] = [...];
for(const v of new MyIterable(), [a,b,c]){ // bogus syntax
console.log(v);
a = 5; //
}
这实际上有一些用例:
1.使用一些更智能内部定义的条件,更早地脱离迭代?
1.过滤结果
然而,我们可以用其他方式来完成这些事情,所以肯定不是那么有用。
因此,我的第二个问题是--就迭代和传递自定义值而言,这是否与它将要达到的效果一样好:
const generate = function*(iterator: Iterator<any>, a, b, c) {
while(1){
const {done,value} = iterator.next.apply(iterator,[a,b,c]);
if(done){
return;
}
yield value;
}
};
可以这样使用:
for(const v of generate(new MyIterable()[Symbol.iterator](), 3,4,5)){
console.log(v);
}
1条答案
按热度按时间deyfvvtc1#
这会起作用,但不要这样做: