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('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.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