JavaScript迭代器不起作用

时间:2018-10-11 23:37:28

标签: javascript iterator

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 个答案:

答案 0 :(得分: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 iterable/iterator protocol here的更多信息。

答案 1 :(得分:2)

您可以使对象的[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);
}