【问题标题】:How to iterate over an iterator?如何迭代一个迭代器?
【发布时间】:2019-07-24 16:31:49
【问题描述】:

here 所述,所有 ES6 迭代器都是可迭代的(因此,您可以向它们申请 for-of 等)。 考虑到以下简短的演示,我试图弄清楚为什么我不能迭代 it 并且我得到 TypeError: it is not iterable 错误。

var counter ={
   [Symbol.iterator](){
      var start=0, end=10, step=1;
      var current = start; 

      return {
        next(){
          var done = current > end;
          if(done) return {value: undefined, done: true};        
          var res = {value: current, done: false};
          current += step;
          return res;
      }
    }
  }
}
  

var it = counter[Symbol.iterator]();

for(let t of it){
  console.log(t)
}

感谢任何帮助。

【问题讨论】:

  • for(let t of counter) ... 或者你添加return { [Symbol.iterator](){ return this }, next(){...}}
  • 我想知道迭代器是如何可迭代的。

标签: javascript ecmascript-6 iterator


【解决方案1】:

该语句没有说“所有迭代器都是可迭代的”,而是“ES6 中内置的所有迭代器都继承自 IteratorPrototype,因此是可迭代的” .您的自定义迭代器 {next(){…}} 是一个普通对象并且不可迭代,因为它没有(或继承)Symbol.iterator 属性。

【讨论】:

    【解决方案2】:
    let counter = {
      from: 1,
      to: 5,
    
      [Symbol.iterator]() {
        this.current = this.from;
        return this;
      },
    
      next() {
        if (this.current <= this.to) {
          return { done: false, value: this.current++ };
        } else {
          return { done: true };
        }
      }
    };
    
    let it = counter[Symbol.iterator]();
    
    for(let t of it){
      console.log(t)
    }
    

    你在任何对象上的 Iterable 实现都应该像上面那样,这样它应该总是返回带有 Symbol 的对象。但是,如果您返回一个带有 next() 函数的对象。只要检查一下你的“它”里面有什么,你就会得到答案。

    理想情况下,counterit 变量应具有如下对象,

    counter;
    {from: 1, to: 5, next: ƒ, current: 6, Symbol(Symbol.iterator): ƒ}
    it;
    {from: 1, to: 5, next: ƒ, current: 6, Symbol(Symbol.iterator): ƒ}
    

    参考:https://javascript.info/iterable

    【讨论】:

      【解决方案3】:
      const counter = {
       from: 1,
       to: 10
      }
      
      counter[Symbol.iterator] = function() {
       return {
         current: this.from,
         last: this.to,
         next() {
          if (this.current <= this.last) {
           return { done: false, value: this.current++ };
          } else {
           return { done: true }
          }
         }
       }
      }
      
      
      for(let num of counter) {
       console.log(num)
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-23
        • 2023-03-17
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 2021-10-15
        • 2015-06-17
        相关资源
        最近更新 更多