ECMAScript 2021 正式確認
- 2021 年 6 月 30 日
- 筆記
- ECMA, javascript, js
ECMAScript 2021 主要包含內容:
ECMAScript 2021 於2021年6月22日獲得 ECMA International 的批准。ECMAScript 是標準化的 JavaScript 語言,於 1997 年發佈了第一版,現已發展成為世界上使用最廣泛的通用編程語言之一。
本 Ecma 標準定義了 ECMAScript 2021 Language,是 ECMAScript 語言規範的第 12 版。
String.prototype.replaceAll
此前,如果想要替換所有的 string occurrences,則需要使用 String.prototype.replace 和全局 regexp 的組合。現在,String.prototype.replaceAll簡化了這一點。
const str = "hello-world";
// before
str.replace(/-/g, "_")
// "hello_world"
// now
str.replaceAll("-", "_")
// "hello_world"
Promise.any
將 Promise.any 加入了 2021 年規範中的 Promise combinators 列表。當你想處理第一個 fulfills 的 Promise 時,可以使用 Promise.any。與 Promise.race 不同,當其中一個 promises fail 時,它不會 reject。更多詳情可查看「Promise combinators explained」。
// 官方提供例子-檢測哪個網站更快
Promise.any([
fetch('//v8.dev/').then(() => 'home'),
fetch('//v8.dev/blog').then(() => 'blog'),
fetch('//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.log(error);
});
WeakRefs
WeakRefs 提案為語言帶來了兩個新的 contructors:WeakRef 和 FinalizationRegistry。這些新功能是更複雜、更低級的語言概念。
1、WeakRef
當將一個對象分配給一個變量時,它指向存儲這個對象的值的那塊內存(強引用)。如果程序不再引用這個對象,garbage collector 會銷毀它並回收內存。WeakRef 的一個實例創建了一個對給定對象的引用,如果該對象仍然在內存中,則返回該對象;如果目標對象已經被垃圾回收,則返回未定義的對象。
const obj = { spec: "ES2021" };
const objWeakRef = new WeakRef(obj);
objWeakRef.deref(); // 如果對象obj被回收則返回undefined,否則就返回obj
2、FinalizationRegistry
FinalizationRegistry 的實例在註冊的目標對象被垃圾收集後觸發回調函數。
const obj = { spec: "ES2021" };
const registry = new FinalizationRegistry(value => {
console.log(`${value}`); // 被回收則執行
});
registry.register(obj, "ECMAScript 2021"); // 對象obj被回收時會執行此回調函數
值得注意的是,官方提示要盡量避免使用 WeakRef 和 FinalizationRegistry,垃圾回收機制依賴於 JavaScript 引擎的實現,不同的引擎或是不同版本的引擎可能會有所不同。
Logical Assignment Operators
顧名思義,邏輯賦值運算符是邏輯運算符(&&, || and ??)和賦值運算符(=)的組合。
??(空值合併操作符-ecma2020);示例: let a = null ?? 2; // 2
a &&= b; // a = a && b;
a ||= b; // a = a || b;
a ??= b; // a = a ?? b;
Numeric separators
數字的可讀性隨着數字長度的增加而降低。現在,則可以使用下劃線(_, U+005F)來分隔數字組,使得長數字更加清晰可讀。這個功能在 Java、Python、Perl、Ruby、Rust、Julia、Ada、C# 等其他編程語言中也很有名。
const population = 37_653_260