功能支援
我們的 JavaScript 和 WebAssembly 語言功能解釋器經常包括如下的功能支援列表:
未支援的功能會像這樣顯示:
對於最新的功能,通常會出現不同環境下的混合支援情況:
目標是提供關於功能成熟度的快速概覽,不僅限於 V8 和 Chrome,也包括更廣泛的 JavaScript 生態系統。請注意,這不限於在 V8 等積極開發的 JavaScript VM 中的原生實現,還包括工具支援,這裡透過 Babel 圖標表示。
我們的 JavaScript 和 WebAssembly 語言功能解釋器經常包括如下的功能支援列表:
未支援的功能會像這樣顯示:
對於最新的功能,通常會出現不同環境下的混合支援情況:
目標是提供關於功能成熟度的快速概覽,不僅限於 V8 和 Chrome,也包括更廣泛的 JavaScript 生態系統。請注意,這不限於在 V8 等積極開發的 JavaScript VM 中的原生實現,還包括工具支援,這裡透過 Babel 圖標表示。
本章節解釋JavaScript(由ECMA-262(ECMAScript)及ECMA-402(ECMAScript 国际化 API)規範的程式語言) 和WebAssembly(Wasm)中的最新功能。
「顯式資源管理提案」引入了一種確定性的方法,用於顯式管理資源的生命週期,比如檔案控制代碼、網絡連線等。該提案帶來了以下新增功能:using
和 await using
聲明,可在資源超出作用域時自動呼叫 dispose 方法;[Symbol.dispose]()
和 [Symbol.asyncDispose]()
符號,用於清理操作;兩個全新的全域物件 DisposableStack
和 AsyncDisposableStack
作為容器以匯總可清除的資源;以及 SuppressedError
,作為一種新的錯誤類型(包含最近拋出的錯誤及被抑制的錯誤),用於解決在處置資源期間出現錯誤可能掩蓋既存錯誤的情況,或者另一資源的處置過程中拋出的錯誤。這些新增功能使開發者能夠通過細粒度的資源處置控制撰寫更可靠、高效且可維護的代碼。
迭代器輔助工具 是在 Iterator 原型上新增的一組方法,用於幫助迭代器的一般使用。由於這些輔助方法在迭代器原型上,因此任何在其原型鏈上具有 Iterator.prototype
的對象(例如陣列迭代器)都可以使用這些方法。在以下子部分中,我們解釋了迭代器輔助工具。所有提供的範例都是在一個包含博客文章列表的博客歸檔頁面上運作,展示如何使用迭代器輔助工具來尋找和操作文章。你可在 V8 博客頁面 上嘗試它們!
JavaScript 自 ECMAScript 3(1999 年)以來便支持正則表達式。十六年後,ES2015 引入了Unicode 模式(u
標誌)、粘性模式(y
標誌)和 RegExp.prototype.flags
的取數器。再過三年,ES2018 引入了dotAll
模式(s
標誌)、後行斷言、命名捕獲組以及Unicode 字符屬性逃脫。而在 ES2020 中,String.prototype.matchAll
讓使用正則表達式變得更簡單。JavaScript 正則表達式已走過很長一段路,並仍在改進。
在 Array
中查找滿足某個條件的元素是一項常見任務,可以使用 Array.prototype
和各種 TypedArray 的 find
和 findIndex
方法完成。Array.prototype.find
接收一個謂詞,並返回陣列中第一個對該謂詞返回 true
的元素。如果謂詞對任何元素都未返回 true
,則該方法返回 undefined
。
新的 at
方法在 Array.prototype
、各種 TypedArray 原型和 String.prototype
上,可以更輕鬆且簡潔地訪問集合末尾附近的元素。
從集合的末尾訪問第 N 個元素是一個常見操作。然而,通常的方法可能會比較冗長,例如 my_array[my_array.length - N]
,或者表現可能不夠高效,例如 my_array.slice(-N)[0]
。新的 at
方法通過解讀負數索引代表“從末尾”來使此操作更具可讀性。之前的例子可以表達為 my_array.at(-N)
。
假設你有一個函數正在調用兩個分開的工作負載 doSomeWork
和 doMoreWork
。這兩個函數可以拋出同類型的錯誤,但你需要以不同方式處理它們。
捕捉錯誤並帶有額外上下文信息再次拋出是解決這個問題的一種常見方法,例如:
function doWork() {
try {
doSomeWork();
} catch (err) {
throw new CustomError('某些工作失敗', err);
}
doMoreWork();
}
try {
doWork();
} catch (err) {
// |err| 是來自 |doSomeWork| 還是 |doMoreWork|?
}
可惜上述解決方案比較繁瑣,因為需要創建自己的 CustomError
。而更糟的是,沒有任何開發工具能為意外異常提供有用的診斷信息,因為目前還沒有關於如何正確表示這些錯誤的共識。
今天,編寫像這樣的代碼很常見:
const hasOwnProperty = Object.prototype.hasOwnProperty;
if (hasOwnProperty.call(object, 'foo')) {
// `object` 擁有屬性 `foo`。
}
或者使用一些庫來提供簡化版的 Object.prototype.hasOwnProperty
,例如 has 或 lodash.has。
通過 Object.hasOwn
提案,我們可以簡單地編寫:
if (Object.hasOwn(object, 'foo')) {
// `object` 擁有屬性 `foo`。
}
Object.hasOwn
已經可以在 V8 v9.3 中使用,只需啟用 --harmony-object-has-own
標誌,並且我們很快會在 Chrome 中推出。
Object.hasOwn
支援情況