Es各版本新特性一览

本文大纲
  1. 1. Es6 (2015)
  2. 2. ES7(2016)
  3. 3. ES8(2017)
  4. 4. ES9(2018)
  5. 5. ES10(2019)
  6. 6. ES11(2020)
  7. 7. ES12(2021)
  8. 8. (预)ES13(2022)

简单罗列下,便于速查

土名 版本 年版 发表日期 与前版本的差异
1 1997.6 首版
2 1998.6 格式修正,以使得其形式与ISO/IEC16262国际标准一致
3 1999.12 强大的正则表达式,更好的词法作用域链处理,新的控制指令,异常处理,错误定义更加明确,数据输出的格式化及其它改变
4 放弃 由于关于语言的复杂性出现分歧,第4版本被放弃,其中的部分成为了第5版本及Harmony的基础
5 2009.12 新增“严格模式(strict mode)”,一个子集用作提供更彻底的错误检查,以避免结构出错。澄清了许多第3版本的模糊规范,并适应了与规范不一致的真实世界实现的行为。增加了部分新功能,如getters及setters,支持JSON以及在对象属性上更完整的反射
5.1 2011.6 ECMAScript标5.1版形式上完全一致于国际标准ISO/IEC 16262:2011。
Es 6 6 ES2015 2015.6 第 6 版,最早被称作是 ECMAScript 6(ES6),添加了类和模块的语法,其他特性包括迭代器,Python风格的生成器和生成器表达式,箭头函数,二进制数据,静态类型数组,集合(maps,sets 和 weak maps),promise,reflection 和 proxies。作为最早的 ECMAScript Harmony 版本,也被叫做ES6 Harmony。
Es 7 7 ES2016 2016.6 第 7 版,多个新的概念和语言特性[9]
Es 8 8 ES2017 2017.6 第 8 版,多个新的概念和语言特性[10]
Es 9 9 ES2018 2018.6 第 9 版,包含了异步循环,生成器,新的正则表达式特性和 rest/spread 语法。
Es10 10 ES2019 2019.6 第 10 版
Es11 11 ES2020 2020.6 第 11 版
Es12 12 ES2021 2021.6 第 12 版
Es13 13 ES2022 预2022.6 第 13 版

Es6 (2015)

  • 类(class)
  • 模块化(ES Module) / import
  • 箭头函数(Arrow)
  • 函数参数默认值
  • 模板字符串
  • 解构赋值
  • 延展操作符
  • 对象属性简写
  • Promise
  • let和const
  • for…of
  • Symbol
  • 迭代器(Iterator)/ 生成器(Generator)
  • Set / WeakSet
  • Map / WeakMap
  • Proxy / Reflect
  • Regex对象的扩展 (u、y修饰符, .flags)
  • Array.from、Array.of、[].copyWithin、[].find、[].findIndex、[].fill、[].entries、[].keys、[].values

ES7(2016)

  • Array.prototype.includes()
  • 指数操作符 **
  • 带标签的模版字面量转义序列的规则

ES8(2017)

  • async/await
  • Object.values() / Object.entries() / Object.keys()
  • String padding (padStart, padEnd)
  • 函数参数列表结尾允许逗号
  • Object.getOwnPropertyDescriptors() (获取一个对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。)
  • SharedArrayBuffer对象 (用来表示一个通用的,固定长度的原始二进制数据缓冲区)
  • Atomics对象 (提供了一组静态方法用来对 SharedArrayBuffer 对象进行原子操作)

ES9(2018)

  • 异步迭代 (await可以和for…of循环一起使用,以串行的方式运行异步操作) for await (num of asyncGenerator()) {}
  • Promise.finally()
  • Rest/Spread 属性
  • 扩展运算符可用于对象
  • 正则表达式 Unicode 转义 / 命名捕获组 / 反向断言 / dotAll模式
  • 模板字符串允许嵌套支持常见转义序列,移除对 ECMAScript 在带标签的模版字符串中转义序列的语法限制

ES10(2019)

  • Array.flat()和Array.flatMap()
  • String.trimStart()和String.trimEnd()
  • String.prototype.matchAll
  • Object.fromEntries()
  • Symbol.prototype.description
  • 可选 Catch (catch 的参数可省略)
  • Function.prototype.toString() (现在返回精确字符,包括空格和注释)
  • Array.prototype.sort() 更加稳定
  • 更加友好的 JSON.stringify;行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与JSON匹配

ES11(2020)

  • 空值合并运算符 ?? (let a = user.u ?? ‘bbb’)
  • 可选链 ?. (a?.b?.c?.d)
  • Promise.allSettled (返回一个在所有给定的promise已被决议或被拒绝后决议的promise,并带有一个对象数组,每个对象表示对应的promise结果)
  • 动态import
  • BigInt
  • globalThis
  • String.prototype.matchAll

ES12(2021)

  • 逻辑赋值运算符 ||= &&= ??= (如:a ||= b, a &&= b, a ??= b)
  • 数字分隔符 1_000_000_000
  • String.prototype.replaceAll
  • Promise.any
  • WeakRefs 允许您保留对另一个对象的弱引用,而不会阻止被弱引用对象被垃圾回收
  • FinalizationRegistry 可以让你在对象被垃圾回收时执行回调

(预)ES13(2022)

  • 声明类的字段: 到目前为止,在ES规范中,类的字段定义和初始化是在类的构造函数中完成的。但是在新的提案中,类字段可以在类的顶层被定义和初始化
  • 私有方法和字段 #: 用#前缀来定义类的私有方法和字段
  • 类的静态公共方法和字段: 类增加了静态公共字段、静态私有方法和静态私有字段的特性
  • 正则匹配索引: 该提案提供了一个新的/dflag,以获得关于输入字符串中每个匹配的开始和索引位置结束的额外信息
  • Top-level await: 顶层的await允许在异步函数之外使用await关键字。这个提案允许模块当做大型异步函数,所以这些ECMAScript模块可以等待资源加载,这样其他导入这些模块的模块在开始执行自己的代码之前也要等待资源加载完再去执行
  • 检测私有字段
  • 在所有内置的可索引数据上新增.at()方法: 新增一个新的数组方法,通过给定的索引来获取一个元素。当给定的索引为正数时,这个新方法的行为与使用括号符号的访问相同,但是当我们给定一个负整数的索引时,它就像python的 “负数索引 “一样工作,这意味着at()方法以负整数为索引,从数组的最后一项往后数。所以该方法可以被执行为array.at(-1),它的行为与array[array.length-1]相同
  • Object.hasOwn(object, property): 简单讲就是使用Object.hasOwn来替代Object.prototype.hasOwnProperty.call(太长了,不好看)
  • ECMAScript类静态初始化块: 类静态块提议提供了一种优雅的方式,在类声明/定义期间评估静态初始化代码块,可以访问类的私有字段

参考资料

esmacript finished github