ECMAScript 的发展及其版本简称对照图示:
前置概念
ECMAScript:ESMA是欧洲计算机制造协会,国际组织,主要负责维护各种计算机的相关标标准,包括推动JavaScript的标准化。 ECMAScript(或ES),是 JS 的规范,而 JS 是 ES 的一种实现方法。
TC39:是ECMA为ES专门组织的技术委员会(Technical Committee),TC39的成员由各个主流浏览器厂商的代表构成。
ECMA-262:Ecma 国际的标准,都会以 Ecma-Number 命名,ECMA-262 就是 ECMA 262 号标准,具体就是指 ECMAScript 遵照的标准。可以在 TC39的ECMA262官网 查看最新的草案。
从一个提案提出到最后纳入ES新特性,TC39规定有如下五步:
- stage0(strawman):任何TC39的成员都可以提交。
- stage1(proposal):进入此阶段就意味着这一提案被认为是正式的了,需要对此提案的场景与API进行详尽的描述。
- stage2(draft):演进到这一阶段的提案如果能最终进入到标准,那么在之后的阶段都不会有太大的变化,因为理论上只接受增量修改。
- state3(candidate):这一阶段的提案只有在遇到了重大问题才会修改,规范文档需要被全面的完成。
- state4(finished):这一阶段的提案将会被纳入到ES每年发布的规范之中,只有到这个阶段的提案才会被标记为“已完成”,并在将来进入到下一个 ES 标准里。
ES6(ES2015)
- let和const
- 类(class)
- 模块化(ES Module)
- 箭头(Arrow)函数
- 函数参数默认值
- 模板字符串
- 解构赋值
- 延展操作符 ...
- 对象属性简写
- Promise
ES7(ES2016)
- Array.prototype.includes()
- 指数操作符 **
ES8(ES2017)
- async/await: 异步终极解决方案
- Object.values()
- Object.entries()
- String padding:String.prototype.padStart、String.prototype.padEnd
- 函数参数列表结尾允许逗号
- Object.getOwnPropertyDescriptors(): 获取一个对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象
- SharedArrayBuffer 对象:用来表示一个通用的,固定长度的原始二进制数据缓冲区
- Atomics 对象:提供了一组静态方法用来对 SharedArrayBuffer 对象进行原子操作
ES9(ES2018)
- 异步迭代:await可以和for...of循环一起使用,以串行的方式运行异步操作
- Promise.finally():逻辑只可以放在一个地方,这有点像以前
jQuery ajax
的complete
- Rest/Spread 属性:允许我们将一个剩余参数表示为一个数组
- 正则表达式命名捕获组:允许命名捕获组使用符号
?<name>
- 正则表达式反向断言(lookbehind)
- 正则表达式dotAll模式:正则表达式中点.匹配除回车外的任何单字符,标记s改变这种行为,允许行终止符的出现
- 正则表达式 Unicode 转义: Unicode 属性转义形式为
\p{...}
和\P{...}
ES10(ES2019)
- Array.flat()和Array.flatMap():数组展平
- String.trimStart()和String.trimEnd():去掉开头结尾空格文本
- String.prototype.matchAll:为所有匹配的匹配对象返回一个迭代器
- Symbol.prototype.description:只读属性,回 Symbol 对象的可选描述的字符串
- Object.fromEntries():返回一个给定对象自身可枚举属性的键值对数组
- 可选 Catch
- JSON Superset 超集
- JSON.stringify() 加强格式转化
- Array.prototype.sort() 更加稳定
- Function.prototype.toString() 重新修订
ES11(ES2020)
- 动态 import ():按需导入
- 空值合并运算符:表达式在 ?? 的左侧 运算符求值为undefined或null,返回其右侧
- 可选链接:?.用户检测不确定的中间节点
- BigInt:新基本数据类型,表示任意精度的整数
- globalThis:浏览器:window、worker:self、node:global
- Promise.allSettled:返回一个在所有给定的promise已被决议或被拒绝后决议的promise,并带有一个对象数组,每个对象表示对应的promise结果
for-in
结构:用于规范for-in
语句的遍历顺序
ES12(ES2021)
- String.prototype.replaceAll:有了这个 API,替换字符不用写正则了
- Promise.any() :返回第一个 fullfilled 的 promise ,若全部 reject,则返回一个带有失败原因的 AggregateError。
- 新增逻辑赋值操作符: ??=、&&=、 ||=
- WeakRefs:使用弱引用对象,该弱引用不会阻止 GC,并且可以在 GC 前使用 WeakRef.prototype.deref ( ) 解除该引用。
- 下划线 (_) 分隔符:使用 _ 分隔数字字面量以方便阅读
- Intl.ListFormat :用来处理和多语言相关的对象格式化操作
- Intl.DateTimeFormat API 中的 dateStyle 和 timeStyle 的配置项:用来处理多语言下的时间日期格式化的函数
ES13(ES2022)
- 声明类的字段:类字段可以在类的顶层被定义和初始化
- 私有方法&字段:用
#前缀
来定义类的私有方法和字段 - 类的静态公共方法和字段:增加了
静态公共字段
、静态私有方法
和静态私有字段
的特性 - ECMScript 类静态初始化块:在类声明/定义期间评估静态初始化代码块,可以访问类的私有字段
- 检测私有字段:可以使用in操作符,如果指定的属性/字段在指定的对象/类中,则返回真,并且也能判断私有字段
- 正则匹配索引:该提案提供了一个新的
/d
flag,以获得关于输入字符串中每个匹配的开始和索引位置结束的额外信息 - 在所有内置的可索引数据上新增.at()方法
- Object.hasOwn(object, property):使用 Object.hasOwn 替代 Object.prototype.hasOwnProperty.call
- Error Cause:为了便捷的传递导致错误的原因