生成器方法是啥意思,请教

网上看到这东西,完全不懂什么意思,而且也报错了,请教大神指导

class Collection {
    constructor() {
        this.items = [];
    }
    *[Symbol.iterator]() {
        yield *this.items.values();
    }
}
var collection = new Collection();
collection.items.push(1);
collection.items.push(2);
collection.items.push(3);
for (let x of collection) {
    // 1
    // 2
    // 3
    console.log(x);
}
阅读 1.8k
2 个回答

for (let x of collection) {}
等价于
for (let x of collection[Symbol.iterator]()) {}
效果:遍历迭代器。

Collection类中

// 这是个生成器函数
*[Symbol.iterator]() {
    yield *this.items.values();
}

而执行生成器函数会返回一个迭代器。
iter = collection[Symbol.iterator]();

for (let x of collection[Symbol.iterator]()) {}
等价于
for (let x of iter) {}

来看iter这个迭代器
*[Symbol.iterator]() {}生成器函数内yield *表达式执行了this.items.values方法,返回1个迭代器,每次遍历该迭代器返回数组每一项的值。(Array.prototype.values() 方法 chrome未实现所以报错)

那么:
for (let x of iter) {}
等价于
for (let x of collection.items) {}


不大好讲。。感觉至少得先了解迭代器和生成器的概念。。。
贴个参考链接吧

这个解释下来 不是容易的事! 分几点把: 参考!
1 你的明白什么是迭代器 因为生成器就是迭代器的另一种方法 比迭代器更高明是可以修改内部状态

2 生成器是可以作为迭代器工厂的特殊函数。如果一个函数包含了一个或多个 yield 表达式,那么就称它为生成器

3 当一个生成器函数被调用时,函数体不会即刻执行,它会返回一个 generator-iterator 对象。每次调用 generator-iterator 的 next() 方法,函数体就会执行到下一个 yield 表达式,然后返回它的结果。当函数结束或者碰到 return 语句,一个 StopIteration 异常会被抛出!

4 除了 next() 方法,generator-iterator 对象还有一个 send() 方法,该方法可以修改生成器的内部状态。传给 send() 的值将会被当做最后一个 yield 表达式的结果,并且会暂停生成器。在你使用 send() 方法传一个指定值前,你必须至少调用一次 next() 来启动生成器

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题