开发者问题收集

JavaScript 迭代器不起作用

2018-10-11
65
class List{
  constructor(){
    this.data = [1,2,3];
  }

  [Symbol.iterator](){
    return this.data;
  }

}


let list = new List();
for(let i of list)
  console.log(i);

for() 行中的错误:

Uncaught TypeError: undefined is not a function

那么,像在 PHP 中一样,我们无法将迭代器与我们自己的类一起使用吗?

2个回答

这不起作用,因为您没有正确实现可迭代协议。要使对象成为可迭代对象,它必须具有 @@iterator 键(您有), 它返回一个迭代器 ,而这正是您所缺少的(数组是可迭代对象,但不是迭代器)。

但是,由于数组是可迭代对象,因此您可以使用其 @@iterator 属性为其获取可迭代对象。然后您可以返回它。

class List{
  constructor(){
    this.data = [1,2,3];
  }

  [Symbol.iterator](){
    return this.data[Symbol.iterator]();
  }

}


let list = new List();
for(let i of list)
  console.log(i);

您可以在此处阅读有关 Javascript 可迭代对象/迭代器协议 的更多信息。

CRice
2018-10-11

您可以将对象的 [Symbol.iterator] 属性设为生成器而不是函数,然后使用 * 单独生成列表元素:

class List {
  constructor() {
    this.data = [1, 2, 3];
  }

  *[Symbol.iterator]() {
    yield* this.data;
  }

}

let list = new List();
for (let i of list) {
  console.log(i);
}
Mark
2018-10-11