ECMAScript 2021 现已获得 ECMA International 的批准。ECMAScript 是标准化的 JavaScript 语言,于 1997 年发布了第一版,现已发展成为世界上使用最广泛的通用编程语言之一。
本 Ecma 标准定义了 ECMAScript 2021 Language,是 ECMAScript 语言规范的第 12 版。
ECMAScript 2021 主要包含的内容如下:
String.prototype.replaceAll
此前,如果想要替换所有的 string occurrences,则需要使用 String.prototype.replace
和全局 regexp 的组合。现在,String.prototype.replaceAll
简化了这一点。代码如下:
1 | const string = "it-is-just-a-test"; |
AggregateError
AggregateError 是一种新的 error type ,用于同时表示多个 error。
Promise.any
将 Promise.any
加入了 2021 年规范中的 Promise combinators 列表。当你想处理第一个 fulfills 的 Promise 时,可以使用 Promise.any
。与 Promise.race
不同,当其中一个 promises fail 时,它不会 reject。
Promise.any
用法如下:
1 | const API = "https://api.github.com/users" |
WeakRefs
WeakRefs 提案为语言带来了两个新的 contructors:WeakRef
和 FinalizationRegistry
。这些新功能是更复杂、更低级的语言概念。
1、WeakRef
当将一个对象分配给一个变量时,它指向存储这个对象的值的那块内存(强引用)。如果程序不再引用这个对象,garbage collector 会销毁它并回收内存。WeakRef
的一个实例创建了一个对给定对象的引用,如果该对象仍然在内存中,则返回该对象;如果目标对象已经被垃圾回收,则返回未定义的对象。
1 | const obj = { spec: "ES2021" }; |
2、FinalizationRegistry
FinalizationRegistry
的实例在注册的目标对象被垃圾收集后触发回调函数。
1 | const obj = { spec: "ES2021" }; |
值得注意的是,官方提示要尽量避免使用 WeakRef
和 FinalizationRegistry
,垃圾回收机制依赖于 JavaScript 引擎的实现,不同的引擎或是不同版本的引擎可能会有所不同。
逻辑赋值运算符(Logical Assignment Operators)
顾名思义,逻辑赋值运算符是逻辑运算符(&&
, ||
和 ??
)和赋值运算符(=
)的组合。
1 | // set a to b only when a is truthy |
数字分隔符(Numeric separators)
数字的可读性随着数字长度的增加而降低。现在,则可以使用下划线(_
, U+005F)来分隔数字组,使得长数字更加清晰可读。这个功能在 Java、Python、Perl、Ruby、Rust、Julia、Ada、C# 等其他编程语言中也很有名。
示例代码如下:
1 | const population = 37_653_260 |
关于 ECMAScript 2021 的更多新特性,可以参考 https://tc39.es/ecma262/2021/,本文不再赘述。