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:const shallowCopy = {...obj};
-
解构属性
:当对象解构一个值时,我们现在可以使用解构语法(...)来获取一个对象中所有以前未提及的属性。const {a, ...remaining} = {a: 1, b: 2, c: 3}; assert.deepEqual(remaining, {b: 2, c: 3});
-
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() 改变了这一点。它可以在任何地方使用(包括条件语句),我们可以计算它的参数。
- import.meta 包含当前模块的元数据。它的第一个广泛支持的属性是 import.meta.url 包含一个带有当前模块文件 URL 的字符串。
- 命名空间重新导出:以下表达式导入'mod'命名空间对象中模块的所有导出ns并导出该对象。
`export * as ns from 'mod';`
-
属性访问和方法调用的可选链接
。可选链接的一个示例是:`value.?prop`
此表达式的计算结果为 undefined。否则,它的计算结果为value.prop。当某些属性可能丢失时,此功能在属性读取链中特别有用。
-
空值合并运算符 (??)
:value ?? defaultValue
该运算符允许我们在缺少某些内容时使用默认值。
以前在这种情况下使用了逻辑或运算符 (||),但它在这里有缺点,因为只要左侧是假的(这并不总是正确的),它就会返回默认值。 -
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()仅替换第一次出现的字符串):'abbbaab'.replaceAll('b', 'x'); // 'axxxaax'
-
Promise.any() 和 AggregateError
:Promise.any() 返回一个 Promise,一旦 Promise 的可迭代中的第一个 Promise 完成,它就会完成。如果只有拒绝,则将它们放入 AggregateError 成为拒绝值的其中。
Promise.any() 只对几个中第一个实现的 Promise 感兴趣时使用。 -
逻辑赋值运算符
:a ||= b; a &&= b; a ??= b;
-
下划线 ( _) 作为分隔符
:- 数字文字:123_456.789_012
- Bigint 字面量:6_000_000_000_000_000_000_000_000n
WeakRefs
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()
可索引值的方法让我们可以读取给定索引处的元素(如括号运算符[])并支持负索引(与括号运算符不同)。
以下“可索引”类型具有方法.at():['a', 'b', 'c'].at(0); // 'a' ['a', 'b', 'c'].at(-1); // 'c'
- string
- Array
- 所有类型化数组类:Uint8Array 等。
-
RegExp 匹配索引
:如果我们向正则表达式添加一个标志,使用它会生成匹配对象,记录每个组捕获的开始和结束索引。 -
Object.hasOwn(obj, propKey)
提供了一种安全的方法来检查对象 obj 是否具有带有 key 的自己的属性 propKey。与相比 Object.prototype.hasOwnProperty,它适用于所有对象。
网友评论