由*
符号和yield
关键字组成。
当const iterator = generation([1, 2, 3])
, 其执行流程如下:
iterator.next() ==> { value: 1, done: false }
iterator.next() ==> { value: 2, done: false }
iterator.next() ==> { value: 3, done: false }
iterator.next() ==> { value: undefined, done: true }
到了第四次,value为undefined
的时候,done为true(也就是说,当done为true的时候,value一定为undefined)。所以说,yield
的作用有两个:
- 生成一个值,将该值封装成一个对象,而这个对象是
{ value: .., done: flase/true }
这样的形式。 - 停下来
可以明显的看出来,生成器有一个作用,通过next这个接口,可以看到迭代的过程。
既然说生成器生成了一个迭代器,那么是不是说生成器执行后的结果就是一个迭代器呢?既然是迭代器,自然就可以被for of
给遍历。