网上看到这东西,完全不懂什么意思,而且也报错了,请教大神指导classCollection{constructor(){this.items=[];}*[Symbol.iterator](){yield*this.items.values();}}varcollection=newCollection();collection.items.push(1);collection.items.push(2);collection.items.push(3);for(letxofcollection){//1//2//3console.log(x);}
2 回答
红糖糍粑
TA贡献1815条经验 获得超6个赞
for(letxofcollection){}等价于for(letxofcollection[Symbol.iterator]()){}效果:遍历迭代器。Collection类中//这是个生成器函数*[Symbol.iterator](){yield*this.items.values();}而执行生成器函数会返回一个迭代器。iter=collection[Symbol.iterator]();for(letxofcollection[Symbol.iterator]()){}等价于for(letxofiter){}来看iter这个迭代器*[Symbol.iterator](){}生成器函数内yield*表达式执行了this.items.values方法,返回1个迭代器,每次遍历该迭代器返回数组每一项的值。(Array.prototype.values()方法chrome未实现所以报错)那么:for(letxofiter){}等价于for(letxofcollection.items){}不大好讲。。感觉至少得先了解迭代器和生成器的概念。。。贴个参考链接吧
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
这个解释下来不是容易的事!分几点把:参考!1你的明白什么是迭代器因为生成器就是迭代器的另一种方法比迭代器更高明是可以修改内部状态2生成器是可以作为迭代器工厂的特殊函数。如果一个函数包含了一个或多个yield表达式,那么就称它为生成器3当一个生成器函数被调用时,函数体不会即刻执行,它会返回一个generator-iterator对象。每次调用generator-iterator的next()方法,函数体就会执行到下一个yield表达式,然后返回它的结果。当函数结束或者碰到return语句,一个StopIteration异常会被抛出!4除了next()方法,generator-iterator对象还有一个send()方法,该方法可以修改生成器的内部状态。传给send()的值将会被当做最后一个yield表达式的结果,并且会暂停生成器。在你使用send()方法传一个指定值前,你必须至少调用一次next()来启动生成器
添加回答
举报
0/150
提交
取消