本人明说,迭代器和生成器看了至少有好几个版本的书了,但是感觉都挺那啥的(晦涩难懂)。然后为了加深我自己对迭代器和生成器的了解和认知,决定写这么一篇博客,望各位砥砺前行。
生成器
生成器,我的理解就是一个带有的函数,比如**function generator() {},或者function *generator() {},还有这样function * generator() {}**,这样都能叫生成器函数,那么它有什么用呢?
首先,它可以完成其他函数不可能完成的事情,就是暂停,我走到走到就不走了休息一下,哎,就是玩。那么它是靠什么暂停的呢?靠yield关键字.当生成器函数内部执行到yield的时候,就会暂停然后返回yield后面的数据,例子:
function *myGenerator() {
yield 'hello world!'
yield 20
return 30
}
result变成了一个这个玩意,是不是看不懂,看不懂就对了,因为这是一个迭代器对象,也就是说,我们调用了生成器函数后,返回了一个迭代器对象。那么我们接下来进入第二个阶段。
什么是迭代器(iterator)
我个人理解的迭代器是一个对象,它拥有一个特殊的函数next,调用next后会返回一个{value, done}类型的对象,然后迭代器先后移位。value表示迭代器返回的值,done表示迭代器是否已经将生成器运行完毕。那么了解完了迭代器,我们进入最后一个阶段。
迭代器控制生成器
如你所见,调用生成器后,就会创建一个迭代器。迭代器对象的next方法可以控制生成器的执行,这个方法用来向生成器请求一个值,从而控制生成器。
let result = myGenerator()
let result1 = result.next()
let result2 = result.next()
let result3 = result.next()
console.log(result1);
console.log(result2);
console.log(result3);
好了我们懂了简单的生成器创建迭代器然后迭代器控制生成器了。接着来点我之后看到的东西。
迭代器把执行权交给下一个生成器
正如在标准函数中调用另一个标准函数,我们需要把生成器的执行委托给另一个生成器。
function * myGenerator1() {
yield "1"
yield * myGenerator2()
yield '4'
}
function * myGenerator2() {
yield '2'
yield '3'
}
for(let item of myGenerator1()) {
console.log(item)
}
上面代码中,首先是正常的迭代,然后迭代了一个生成器函数,最后输出大概就是这样(语言措辞我有点不好组织,看懂了前面应该就懂了)
最后一种类型,通过迭代器给生成器里面赋值
迭代器给生成器赋值
function * myGenerator1(val) {
let num = yield val * 2
yield num
}
let result = myGenerator1(2)
let result1 = result.next(3)
let result2 = result.next(5)
console.log(result1, result2);
在next里面的值,会在下一次next的时候传入生成器函数的yield后面,但是注意,因为第一次result = myGenerator1(2)是生成了迭代器,也就是说这时候val值已经被设为了2,在result.next(3)的时候,在前面并没有yield表达式,所有传入的3就会被忽略,而是用之前传入的val,也就是2。之后result.next(5)传入了5,替换之前的yield val * 2,所以num最后为5
冰狗,写完收工,终于把这些搞懂了。好图走起。
好兄弟有人认识这是谁吗??