将值传递给 Symbol.iterator

Jor*_*lva 3 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'
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

// Uncaught TypeError: hello is not a function
Run Code Online (Sandbox Code Playgroud)

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

Ber*_*rgi 6

当你传递一个要在循环中迭代的值时for\xe2\x80\xa6of,它需要实现可迭代接口 - 也就是说,它的Symbol.iterator方法将被隐式调用,不带参数,并且应该返回一个迭代器。

\n\n

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

\n\n

因此,虽然无法使用for\xe2\x80\xa6of特殊参数进行循环调用默认迭代器,但您始终可以自己调用该方法并传递迭代器:

\n\n
var hello = {\n  *[Symbol.iterator](val) {\n    yield val;\n  }\n};\nfor (let val of hello[Symbol.iterator](\'works\')) {\n  console.log(val); // \'works\'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 是的,这些确实应该是两种不同的方法。顺便说一句,原生的“Map” API 有一个默认的“[Symbol.iterator]()”方法,也可以通过“.entries()”进行访问。 (2认同)