生成器 generator 到底是个啥
- 是一个函数
- 可以用来遍历数据结构
- 是解决异步编程的一种方案
- 进行数据流的生成和控制
- 协程和状态机
- 返回一个生成器对象/可迭代对象
- 生成器对象: 生成器对象是由生成器函数返回的对象,它符合迭代器协议(Iterator Protocol)。生成器对象具有
next()
方法,用于启动生成器函数的执行,并在每次调用时返回一个包含value
和done
属性的对象 - 可迭代对象: 可迭代对象是具有迭代器的对象,它符合可迭代协议(Iterable Protocol)。可迭代对象通常是包含有限或无限序列的数据结构,例如数组、集合、映射等。可迭代对象可以通过
for...of
循环或...
扩展运算符等方式进行迭代 - 生成器对象是一种特殊的可迭代对象,因为它们符合迭代器协议。
- 生成器对象: 生成器对象是由生成器函数返回的对象,它符合迭代器协议(Iterator Protocol)。生成器对象具有
- function 关键字和函数名之间有一个*型号
- 函数内部使用 yield 表达式,定义不同的内部状态
- 通过 next 方法才会遍历到 下一个内部状态
- 调用生成器之后的可迭代对象的Symbol.iterator属性,返回它自身
- 可以是用 for ...of 遍历 生成器的运行结果,因为是一个可迭代对象
- 可以通过生成器把对象变成可迭代对象,参考这篇文章,真的超级好用
- 异步解决方案
- Generator不是为了异步设计出来的,他还有其他功能
- 对象迭代
- 控制输出,使用 yield 暂停
- 部署iterator接口
- promise 和 async/await 是专门用于处理异步数据的
- generator ,async 需要与promise 对象搭配处理异步情况
- async 实质是 generator 的语法糖,相当于会自动执行 generator 函数
- 语法糖是一种编程语言中常用的概念,指的是对语言的语法进行改进或扩展、以便更方便,更易读,更符合人类直觉的方式编写代码,但并不改变语言的基本功能或语义。简单来说,语法糖是一种语法上的美化,它并不引入新的功能,只是让代码更易于理解和书写。
- ?:三元运算符是if-else 结构的语法糖
await
是用于异步函数中的关键字,他是 yield 的语法糖- async/await 约等于 generator + promise
- async/await 将异步变成串行执行
- async 返回一个promise 函数
- Generator不是为了异步设计出来的,他还有其他功能
- 生成器可以看作是一个更加灵活的迭代器
生成器的使用场景
- 把对象变成迭代对象,再对象上实现 iterator 接口
- 异步解决的一种方案,使用 async 语法糖
- 实现遍历
- 实现状态机
- 状态机,用于描述程序的行为和状态转换。
- 没调用一次生成器对象切换一个状态
迭代器Iterator是个啥
- Iterator 是一个循环接口,任务实现了这个接口的数据都可以被 for ... of 遍历
- 循环语句调用对象的
data[Symbol.iterator]
函数,根据返回值来进行循环 - 任何提供了 Iterator 接口的就可以被循环
- 参考