【问题标题】:Javascript iterators don't workkJavascript 迭代器不起作用
【发布时间】:2018-10-11 23:37:27
【问题描述】:
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 那样在我们自己的类中使用迭代器?

【问题讨论】:

  • 我认为你需要返回一个迭代器,而不是一个可迭代的——return this.data[Symbol.iterator]()
  • 我用*[Symbol.iterator](){ for(let i of this.data) yield i; }修复了它

标签: javascript iterator


【解决方案1】:

这不起作用,因为您没有正确实现可迭代协议。要使一个对象成为可迭代对象,它必须有一个 @@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 的更多信息。

【讨论】:

    【解决方案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);
    }

    【讨论】:

    • 啊!忍者!我将删除我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2020-11-23
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多