如何在ES6中使用Symbol.iterator进行迭代

时间:2017-11-24 02:43:43

标签: javascript ecmascript-6

目前我在网上课程中遇到了一个教训。

这是问题

//Implement an object named obj which has an Symbol.iterator property which iterates over every digit of the provided this.number.

const obj = {
    number: 53820391,
    [Symbol.iterator] () {
        // TODO: implement me to print out all the digits of this.number
    }
}

这就是我现在正在尝试的

const obj = {
    number: 53820391,
    [Symbol.iterator] () {
        // TODO: implement me to print out all the digits of this.number
        let cur = 0;
        let a = this.number.toString();
        let num = a.split();
        return{
            next() {
                for( let char of num ){
                    return{
                        value: char,
                        done: cur++ > num.length
                    }
                }
            }
        }
    }
}

console.log(obj)

for(let char of obj){
    char
}

我想知道我哪里出错了?以及解决这个问题的过程。

2 个答案:

答案 0 :(得分:2)

这是我能想到的最简单的实现:

const obj = {
    number: 53820391,
    [Symbol.iterator]: function*() {
        yield* this.number.toString();
    }
}

或者,您可以将其实现为

    for (let d of this.number.toString()) {
        yield d;
    }

您的代码有什么问题:next()函数会创建一个新的上下文,因此this引用新的上下文,而不是原始对象。

要解决此问题,您可以保留对const that = this;等原始对象的引用,并在需要的地方使用that引用。

参考文献:

答案 1 :(得分:1)

如果你想保留你所拥有的基本格式,这样就可以看到内部工作,你就非常接近了。你只是不希望next()内的for循环。循环将由调用迭代器的人发生。所以这样的事情有效:

const obj = {
  number: 53820391,
  [Symbol.iterator]() {
    const v = Array.from(this.number.toString())
    return {
      next: () => ({
        done: v.length === 0,
        value: v.shift()
      })
    }
  }
}

for (const i of obj) {
  console.log(i)
}