ECMAScript 2021 正式確認

guojikun發表於2021-06-30

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

檢視更多

相關文章