将值传递给Symbol.iterator

时间:2015-09-13 01:29:00

标签: javascript generator ecmascript-6

如果我为对象定义迭代器并创建一个实例,我可以按预期迭代这些值:

class Hello {
  *[Symbol.iterator]() {
    yield 5;
   }
  *iterator (value) {
    yield value;
  }
}

var hello = new Hello();

for (let val of hello) {
  console.log(val); // 5
}

for (let val of hello.iterator('wow')) {
  console.log(val); // 'wow'
}

在前面的示例中,[Symbol.iterator]被声明为生成器。我可以声明另一个生成器并将参数传递给它,但有没有办法将参数传递给默认迭代器?

我尝试过以下操作,但它会引发错误:

for (let val of hello('wow')) {
  console.log(val); // 5
}

// Uncaught TypeError: hello is not a function

我错过了什么吗?或者这是不可能的?

1 个答案:

答案 0 :(得分:3)

当您在for…of循环中传递要迭代的值时,它需要实现 iterable 接口 - 也就是说,将隐式调用其Symbol.iterator方法没有参数,应该返回一个迭代器。

您也可以直接传递迭代器,因为所有迭代器都是“可迭代的”,它们的Symbol.iterator方法只返回它们。

因此,虽然无法使for…of循环调用具有特殊参数的默认迭代器,但您始终可以自己调用该方法并传递迭代器:

var hello = {
  *[Symbol.iterator](val) {
    yield val;
  }
};
for (let val of hello[Symbol.iterator]('works')) {
  console.log(val); // 'works'
}