前言
ES(ECMAScript)是一套脚本语言设计标准规范,使用它设计实现的语言有JavaScript,ActionScript等。
ES各版本特性一览
ES1-ES4
- 传统特性
ES5 (2009)
- 严格模式 strict mode
- 属性访问器 Getter/Setter
- JSON的静态方法 JSON.parse(), JSON.stringify()
- Arrary 方法 isArray(), forEach(), map()等
- Date.now()
ES2015 (ES6)
- 变量声明let,常量const
- class类
- 箭头函数let func = ()=>{return}
- 函数默认参数let func = (a = 1) => {return}
- 模版字符串 `Hello${content}`
- import/export
- Promise
- 展开运算符...
- Arrary方法 find(), findIndex()
- generator(生成器)
ES2016 (ES7)
- 指数操作符 2**3 = 8
- Arrary方法 includes() // 数组是否包含xxx
ES2017 (ES8)
- 异步函数 async/await
- 允许函数/对象尾逗号
- 共享内存、原子对象
- String方法 padStart(), padEnd()
- Object方法 values(), entries(), getOwnPropertyDescriptors()
ES2018 (ES9)
- 异步迭代
- Rest/Spread 属性
- 正则方法扩充
ES2019 (ES10)
- Array方法flat, flatMap
- Object方法fromEntries
- 可选的catch参数
查询浏览器支持的ES标准
正文
Generator(生成器)函数
Generator函数是ES6下新增的特性,用于异步编程。和普通函数不同的是,调用Generator函数后,函数并不会执行,而是返回一个指向内部状态的指针对象,也就是遍历器对象。
通过调用遍历器对象的next方法,内部指针就从函数头部或者上次停下的地方(yield)开始执行,直到遇到下一个yield表达式或return语句为止,并且会返回一个状态对象{value: "value", done: false},'value'就是生成器函数执行到yield语句之后得到的值,false表示还没有执行完,只是在这暂停。
生成器函数执行器函数
__awaiter:生成器函数执行器,为了解决es2017之前版本,支持async/await特性,通过generate函数、遍历器、yield、Promise来实现
// 原有的async函数会被转换为generator函数,ES2017后支持原生的async/await
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
// 生成器函数包裹为Promise
return new (P || (P = Promise))(function (resolve, reject) {
/* 满足函数,用来递归的执行遍历器的下一个结果 */
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
/* 拒绝函数,用来使遍历器抛出异常 */
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
/* 处理遍历器的下一个结果,即next结果
如果状态为done直接resolve
如果状态不是done,返回新的Promise,通过fulfilled函数再次获取遍历器的下一个next值*/
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
/* 获取生成器函数的遍历器 */
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};