ES6(ECMAScript 2015)
ES6 正式支持了类、模块、迭代器、生成器、箭头函数、Promise、反射、代理和众多新的数据类型
let 和 const
解构赋值
模板字符串
函数参数默认值和箭头函数
扩展运算符
对象的属性简写
super 关键字
Symbol 变量
Set 和 Map 数据
代理和反射
迭代器
Promise
class 类
Module 模块
ES7(ECMAScript 2016)
ECMAScript 2016 中添加了以下功能:
Array.prototype.includes() 检查数组是否包含给定值。
求幂运算符 (**): 4 ** 2 => 16
es8(ECMAScript 2017)
ECMAScript 2017 中添加了以下功能:
异步函数(async/await)让我们使用看起来像同步的语法来编写异步代码。
Object.values() 返回一个数组,其中包含给定对象的所有可枚举字符串键属性的值。
Object.entries() 返回一个数组,其中包含给定对象的所有可枚举字符串键属性的键值对。每对都被编码为一个二元素数组。
字符串填充:字符串方法 String.padStart() 和 String.padEnd() 插入填充文本,直到接收者足够长:
'7'.padStart(3, '0'); // '007'
'yes'.padEnd(6, '!'); // 'yes!!!'
函数参数列表和调用中的尾随逗号:自 ES3 以来,数组文字和自 ES5 以来的对象文字中都允许使用尾随逗号。它们现在也允许在函数调用和方法调用中使用。
Object.getOwnPropertyDescriptors()
ES9(ECMAScript 2018)
ECMAScript 2018 中添加了以下功能:
异步迭代是同步迭代的异步版本。它基于 Promise:
使用同步迭代,我们可以立即访问每个项目。使用异步迭代,我们必须 await 在访问项目之前。
对于同步迭代,我们使用 for-of 循环。对于异步迭代,我们使用 for-await-of 循环。传播到对象文字中
:通过在对象文字中使用传播(...),我们可以将另一个对象的属性复制到当前对象中。一个用例是创建对象的浅拷贝obj
解构属性
:当对象解构一个值时,我们现在可以使用解构语法(...)来获取一个对象中所有以前未提及的属性。
Promise.prototype.finally() 与 finally try-catch-finally 语句的子句相关——类似于 Promise 方法如何.then() 与 try 子句 .catch() 相关并与 catch 子句相关。
换句话说:.finally() 无论 Promise 是否被履行或拒绝,都会执行回调。
新的正则表达式功能
模板文字修订 允许在标记模板中带有反斜杠的文本在字符串文字中是非法的
ES10(ECMAScript 2019)
ECMAScript 2019 中添加了以下功能:
Array.prototype.flatMap() 工作方式类似.map(),但让回调返回零个或多个值的数组,而不是单个值。然后将返回的数组连接起来并成为 .flatMap() 用例包括:
同时过滤和映射
将单个输入值映射到多个输出值
Array.prototype.flat()
将嵌套数组转换为平面数组。或者,我们可以告诉它应该在哪个嵌套深度停止展平。
Object.fromEntries()
从可迭代的条目创建一个对象。每个条目都是一个包含属性键和属性值的二元素数组。
字符串方法:.trimStart() 工作方式 .trimEnd() 类似 .trim(),但仅在字符串的开头或结尾删除空格。
可选catch:如果我们不使用它,我们现在可以省略子句的参数。
Symbol.prototype.description 是读取符号的描述。以前,描述包含在结果中,.toString() 但无法单独访问。
JSON 超集
格式良好JSON.stringify()
Function.prototype.toString()修订
ES11(ECMAScript 2020)
ECMAScript 2020 中添加了以下功能:
新模块功能:
动态导入 import():正常的 import 语句是静态的:我们只能在模块的顶层使用它,它的模块说明符是一个固定的字符串。import() 改变了这一点。它可以在任何地方使用(包括条件语句),我们可以计算它的参数。
此表达式的计算结果为 undefined。否则,它的计算结果为value.prop。当某些属性可能丢失时,此功能在属性读取链中特别有用。
import.meta 包含当前模块的元数据。它的第一个广泛支持的属性是 import.meta.url 包含一个带有当前模块文件 URL 的字符串。
命名空间重新导出:以下表达式导入'mod'命名空间对象中模块的所有导出ns并导出该对象。
属性访问和方法调用的可选链接:
空值合并运算符 (??):该运算符允许我们在缺少某些内容时使用默认值。以前在这种情况下使用了逻辑或运算符 (||),但它在这里有缺点,因为只要左侧是假的(这并不总是正确的),它就会返回默认值。
Bigints – 任意精度整数:Bigints 是一种新的原始类型。它支持可以任意大的整数(它们的存储会根据需要增长)。
String.prototype.matchAll()/g:如果未设置标志,则此方法抛出,并返回一个包含给定字符串的所有匹配对象的可迭代对象。
Promise.allSettled() 接收一个可迭代的 Promises。它返回一个 Promise,一旦所有输入的 Promise 都被解决,该 Promise 就会实现。实现值是一个数组,每个输入 Promise 有一个对象——以下之一:
{ status: 'fulfilled', value: «fulfillment value» }
{ status: 'rejected', reason: «rejection value» }
globalThis 提供了一种访问全局对象的方法,该对象可在浏览器和服务器端平台(如 Node.js 和 Deno)上运行。
for-in: 在 JavaScript 中部分指定对象枚举顺序
ES12(ECMAScript 2021)
ECMAScript 2021 中添加了以下功能:
String.prototype.replaceAll()
让我们替换正则表达式或字符串的所有匹配项(.replace()仅替换第一次出现的字符串)- Promise.any() 和 AggregateError:Promise.any() 返回一个 Promise,一旦 Promise 的可迭代中的第一个 Promise 完成,它就会完成。如果只有拒绝,则将它们放入 AggregateError 成为拒绝值的其中。
Promise.any() 只对几个中第一个实现的 Promise 感兴趣时使用。 逻辑赋值运算符
:下划线 ( _) 作为分隔符
:
ES13(ECMAScript 2022)
ES2022 可能会在 2022 年 6 月成为标准。以下提案已进入第 4 阶段,并计划成为该标准的一部分:
班级新成员:
现在可以通过以下方式创建属性(公共插槽):
实例公共字段
静态公共字段
私有插槽是新的,可以通过以下方式创建:
私有字段(实例私有字段和静态私有字段)
私有方法和访问器(非静态和静态)
静态初始化块
私有插槽检查:以下表达式检查是否obj有私有插槽#privateSlot:
#privateSlot in obj
模块中的顶层 await:我们现在可以在模块 await 的顶层使用,而不必再输入异步函数或方法。
error.cause:Error 及其子类现在让我们指定哪个错误导致了当前错误:
new Error('Something went wrong', {cause: otherError});
.at() 可索引值的方法让我们可以读取给定索引处的元素(如括号运算符[])并支持负索引(与括号运算符不同)。
['a', 'b', 'c'].at(0);
// 'a'
['a', 'b', 'c'].at(-1);
// 'c'
以下“可索引”类型具有方法.at():
string
Array
所有类型化数组类:Uint8Array 等。
RegExp 匹配索引:如果我们向正则表达式添加一个标志,使用它会生成匹配对象,记录每个组捕获的开始和结束索引。
Object.hasOwn(obj, propKey) 提供了一种安全的方法来检查对象 obj 是否具有带有 key 的自己的属性 propKey。与相比 Object.prototype.hasOwnProperty,它适用于所有对象。