ES2021新特性

ES 2021正式通过。

2021 年 6 月 22 日,第 121 届 Ecma 国际(Ecma International)大会以远程会议形式召开。
ECMAScript 2021 (ES12)成为事实的 ECMAScript 标准,并被写入 ECMA-262 第 12 版。
ECMAScript 2021 最终功能集是在今年的 3 月 9 日确定的,详见 ECMAScript 2021: 最终功能集确定【3】。确定【3】

同时,大会还审议通过了 ECMA-402(ECMAScript® 2021 国际化 API 规范) 第 8 版、全新的 ECMA-419(ECMAScript® 嵌入式系统 API 规范)、ECMA TR/109 (嵌入式硬件组件的类规范)第 1 版以及 2 个技术报告。

ES2021 功能
String.prototype.replaceAll :有了这个 API,替换字符不用写正则了

Promise.any() :返回第一个fullfilled 的 promise ,若全部 reject,则返回一个带有失败原因的 AggregateError。
新增逻辑赋值操作符: ??=, &&=, ||=

WeakRefs:使用弱引用对象,该弱引用不会阻止 GC,并且可以在 GC 前使用 WeakRef.prototype.deref ( ) 解除该引用。
下划线 (_) 分隔符:使用 _ 分隔数字字面量以方便阅读

名词解释
ECMA:读音类似“埃科妈”,是欧洲计算机制造商协会(European Computer Manufacturers Association)的简称,是一家国际性会员制度的信息和电信标准组织。

Ecma 国际:1994 年之后,由于 ECMA 组织的标准牵涉到很多其他国家,为了体现其国际性,更名为 Ecma 国际(Ecma International)。

ECMAScript: 由 Ecma 国际在标准 ECMA-262 中定义的脚本语言规范。JavaScript 是 ECMA-262 标准的实现和扩展。

ECMA-262:Ecma 国际的标准,都会以 Ecma-Number 命名,ECMA-262 就是 ECMA 262 号标准,具体就是指 ECMAScript 遵照的标准。1996 年 11 月,网景公司将 JavaScript 提交给 Ecma 国际进行标准化。ECMA-262 的第一个版本于 1997 年 6 月被 Ecma 国际采纳。

扩展阅读
需要注意的是,自从 TC39 进程 制定以来,ECMAScript 版本的重要性就降低了很多。大家不必记住某一个 ES 特性到底是哪年推出的。现在真正重要的是提案处于哪个阶段:一旦提案到了第 4 阶段(Stage 4),那么它就可以使用了。
Ecma International approves new standards
ECMAScript® 2021 Language Specification, 12th edition, June 2021
ECMAScript® 2021 PDF 版本
TC39 - Finished Proposals

下面详解
1.逻辑赋值运算符
带有 && 运算符的逻辑赋值运算符

// Logical Assignment Operator with && operator
let num1 = 5
let num2 = 10
num1 &&= num2
console.log(num1) // 10
// Line 5 can also be written as following ways
// 1. num1 && (num1 = num2)
// 2. if (num1) num1 = num2

带有 || 运算符的逻辑赋值运算符

// Logical Assignment Operator with || operator
let num1
let num2 = 10
num1 ||= num2
console.log(num1) // 10
// Line 5 can also be written as following ways
// 1. num1 || (num1 = num2)
// 2. if (!num1) num1 = num2

带有 ?? 运算符的逻辑赋值运算符

// Logical Assignment Operator with ?? operator
let num1
let num2 = 10
num1 ??= num2
console.log(num1) // 10
num1 = false
num1 ??= num2
console.log(num1) // false
// Line 5 can also be written as following ways
// num1 ?? (num1 = num2)

2.数字分隔符 (1_000)
为了提高可读性,新的 JavaScript 语言功能 启用了下划线作为数字文字中的分隔符

1_000_000_000_000 // 写成这样
1000000000000

3.Promise.any & AggregateError
只要参数实例有一个变成 fulfilled 状态,包装实例就会变成 fulfilled 状态;如果所有参数实例都变成 rejected 状态,包装实例就会变成 rejected 状态。
一个新的错误类型,一次表示多个错误

Promise.any([
  fetch('https://v8.dev/').then(() => 'home'),
  fetch('https://v8.dev/blog').then(() => 'blog'),
  fetch('https://v8.dev/docs').then(() => 'docs')
]).then((first) => {
  // Any of the promises was fulfilled.
  console.log(first);
  // → 'home'
}).catch((error) => {
  // All of the promises were rejected.
  console.assert(error instanceof AggregateError);
  // All of the promises were rejected.
  console.log(error);
});

只有当 所有 请求都失败时,我们才最终进入代码 catch 块,然后在其中处理错误。Promise.any 拒绝可以一次代表多个错误。 为了在语言级别支持此功能,引入了一种新的错误类型,称为 AggregateError。 除了上面示例中的基本用法外,还可以以编程方式构造 AggregateError 对象,就像其他错误类型一样:

const aggregateError = new AggregateError([errorA, errorB, errorC], 'Stuff went wrong!');

4.String.prototype.replaceAll
一次性替换所有匹配

'aabbcc'.replaceAll('b', '.')     // 'aa..cc'
'aabbcc'.replaceAll(/b/g, '.')   // 'aa..cc'
'xxx'.replace(/(?:)/g, '_');   // → '_x_x_x_'
'xxx'.replaceAll('', '_');  // → '_x_x_x_'

5.WeakRefs 和 FinalizationRegistry 对象

let target = {};
let wr = new WeakRef(target);

//wr and target aren't the same


// Creating a new registry
const registry = new FinalizationRegistry(heldValue => {
  // ....
});

registry.register(myObject, "some value", myObject);
// ...some time later, if you don't care about `myObject` anymore...
registry.unregister(myObject);

参考资料:

  1. JavaScript ES2021 最值得期待的 5 个新特性解析
  2. ES2021 Features!

你可能感兴趣的:(ES2021新特性)