将值传递给 Symbol.iterator
Passing value to Symbol.iterator
如果我为一个对象定义一个迭代器并创建一个实例,我可以按预期迭代这些值:
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
我错过了什么吗?或者这是不可能的?
当你在for…of
循环中传递一个要迭代的值时,它需要实现iterable接口——即它的Symbol.iterator
方法将在没有参数的情况下被隐式调用,应该 return 一个迭代器。
您也可以直接传递迭代器,因为所有迭代器都是 "iterable",它们的 Symbol.iterator
方法只是 return 本身。
因此虽然无法使 for…of
循环调用带有特殊参数的默认迭代器,但您始终可以自己调用该方法并传递迭代器:
var hello = {
*[Symbol.iterator](val) {
yield val;
}
};
for (let val of hello[Symbol.iterator]('works')) {
console.log(val); // 'works'
}
如果我为一个对象定义一个迭代器并创建一个实例,我可以按预期迭代这些值:
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
我错过了什么吗?或者这是不可能的?
当你在for…of
循环中传递一个要迭代的值时,它需要实现iterable接口——即它的Symbol.iterator
方法将在没有参数的情况下被隐式调用,应该 return 一个迭代器。
您也可以直接传递迭代器,因为所有迭代器都是 "iterable",它们的 Symbol.iterator
方法只是 return 本身。
因此虽然无法使 for…of
循环调用带有特殊参数的默认迭代器,但您始终可以自己调用该方法并传递迭代器:
var hello = {
*[Symbol.iterator](val) {
yield val;
}
};
for (let val of hello[Symbol.iterator]('works')) {
console.log(val); // 'works'
}