代码之家  ›  专栏  ›  技术社区  ›  Andrey Bushman

通过Symbol.iterator进行迭代不会发生

  •  1
  • Andrey Bushman  · 技术社区  · 7 年前

    Node.js版本10.11.0

    为什么迭代不会在我的代码中发生?

    'use strict';
    const stuff = Object.create(null)
    stuff.items = ['a','b','c','d']
    stuff[Symbol.iterator] = function*(){
        return this.items[Symbol.iterator]()
    }
    for(let n of stuff){
        console.log(n) // It doesn't happen
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Jonas Wilms    7 年前

    您的生成器功能不可用 yield 任何情况下,只返回另一个迭代器,但在for..of中忽略返回值。相反,您可以生成另一个迭代器的条目:

     stuff[Symbol.iterator] = function*(){
       yield* this.items[Symbol.iterator]();
     };
    

    或者将生成器函数转换为常规函数(删除 *

    stuff[Symbol.iterator] = function() {
       return this.items[Symbol.iterator]();
    };
    
        2
  •  1
  •   Ori Drori    7 年前

    设置 stuff 迭代器是 items 迭代器:

    const stuff = Object.create(null)
    
    stuff.items = ['a','b','c','d']
    
    stuff[Symbol.iterator] = stuff.items[Symbol.iterator].bind(stuff.items);
    
    for(let n of stuff){
        console.log(n) // It doesn't happen
    }