概念
Generator对象由生成器函数返回,并且符合可迭代协议和迭代协议 也就是【可遍历】。
语法使用function*语法编写。
在执行方式上,与普通的函数有所区别
普通函数的执行方式是这样的,【执行—结束】。
而生成器函数的执行方式是【执行—暂停—结束】。也就是说,使用生成器,可以随时暂停,也可以随时启动。
该函数内部使用yield表达式,用于定义函数的状态
使用
Genertator函数会返回一个遍历器对象,所以具有Symbol.iterator属性,并返回给自己
通过yield关键字能够暂停generator函数返回的遍历器对象的状态
既上述有三种状态
- 状态一【1】
- 状态二【2】
- 状态三【3】
那么怎么从状态一到达状态二呢,可以通过调用【next()】方法才会遍历至下一个内部状态。
- 遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。
- 下一次调用next方法时,再继续往下执行,直到遇到下一个yield表达式
- 如果没有再遇到新的yield表达式,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值
- 如果该函数没有return语句,则返回的对象的value属性值为undefined
- 其中,【done】属性表示生成器的状态,【false】则后续还有状态,【true】则为结束后续已经没有状态了,全部状态都已经执行完毕
- 注:yield表达式本身是没有返回值的,或者说总是返回undefined
- 通过调用next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值
- 但是调用第一个next时不必传入参数,因为不会生效。因为【第一个yield之前没有yield】
- 往后的就可以传入了
- 并且由于Generator函数返回Iterator对象,我们还可以使用for...of进行遍历
如果原生对象没有iterator接口的话,也就是【可遍历接口】。可以利用该函数在原生对象上添加iterator接口,这样就能使用【for...of】进行遍历了