16 篇文章 含有標籤「ECMAScript」
檢視所有標籤瞭解 ECMAScript 規範,第 3 部分
在這一集中,我們將更深入地探討 ECMAScript 語言及其語法的定義。如果您不熟悉上下文無關文法,那麼現在正是了解基礎知識的好時機,因為規範使用上下文無關文法來定義語言。請參閱《Crafting Interpreters》中關於上下文無關文法的章節以獲得易於理解的介紹,或者查看維基百科頁面以獲得更數學化的定義。
理解 ECMAScript 規範,第2部分
讓我們來多練習一些我們驚人的規範閱讀技巧。如果你還沒看過上一集,現在是個好機會!
準備好進入第2部分了嗎?
了解規範的一個有趣的方法是從我們已知的 JavaScript 功能入手,找出它是如何被規範定義的。
警告!本集包含來自 ECMAScript 規範(截至 2020 年 2 月)的複製粘貼算法,最終它們可能會過時。
我們知道屬性會在原型鏈中查找:如果一個物件沒有我們試圖讀取的屬性,我們會沿著原型鏈往上找到它(或找到一個不再有原型的物件)。
例如:
const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99
原型鏈的查找定義在哪裡?
讓我們嘗試找出這種行為的定義位置。一個不錯的起點是 物件內部方法清單。
這裡既有 [[GetOwnProperty]]
也有 [[Get]]
——我們關心的是不限於 自有 屬性的版本,所以我們選擇 [[Get]]
。
不幸的是,屬性描述符的規範類型 也有一個名為 [[Get]]
的欄位,因此在瀏覽規範時,我們需要小心區分這兩種不同的用法。
額外內容:「理解 ECMAScript 規格,第二部分」
為什麼 o2.foo
是一個 AssignmentExpression
?
o2.foo
看起來不像是一個 AssignmentExpression
,因為沒有賦值操作。為什麼它是一個 AssignmentExpression
?
規格實際上允許 AssignmentExpression
作為參數或賦值右側。例如:
function simple(a) {
console.log('這個參數是 ' + a);
}
simple(x = 1);
// → 輸出「這個參數是 1」。
x;
// → 1
…還有…
x = y = 5;
x; // 5
y; // 5
o2.foo
是一個不執行任何賦值的 AssignmentExpression
。這是根據以下語法產生式的逐層簡化到最後一層:
AssignmentExpresssion
不需要具有賦值操作,它也可以僅僅是一個 ConditionalExpression
:
(還有其他產生式,在這裡僅展示相關部分。)
ConditionalExpression
不必有條件交互操作(如 a == b ? c : d
),它也可以僅僅是一個 ShortcircuitExpression
:
接下來:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
理解 ECMAScript 規範,第一部分
在本文中,我們採用規範中的一個簡單函數,並嘗試理解其標記法。讓我們開始吧!
前言
即使您了解 JavaScript,也可能會覺得閱讀其語言規範,ECMAScript 語言規範,或簡稱 ECMAScript 規範,相當令人生畏。至少這是我第一次閱讀時的感受。
更快且功能更豐富的國際化 API
ECMAScript 國際化 API 規範 (ECMA-402 或 Intl
) 提供了關鍵的區域特定功能,例如日期格式化、數字格式化、複數形式選擇和排序。Chrome V8 和 Google 國際化團隊合作為 V8 的 ECMA-402 實現添加功能,同時清理技術債務並改善效能和與其他瀏覽器的互操作性。
加速擴展元素
在他於 V8 團隊的三個月實習期間,Hai Dang 專注於提升 [...array]
、[...string]
、[...set]
、[...map.keys()]
和 [...map.values()]
的性能(當擴展元素位於數組字面量的開頭時)。他甚至還大幅提升了 Array.from(iterable)
的性能。本文解釋了他改進的部分詳細內容,這些更改從 V8 v7.2 開始被引入。
更快的非同步函式與 Promise
JavaScript 中的非同步處理傳統上被認為速度並不特別快。更糟的是,對即時運行的 JavaScript 應用進行除錯——尤其是 Node.js 伺服器——並不容易,_特別是_涉及非同步程式時。不過幸運的是,時代正在改變。本文將探討我們如何在 V8(以及某種程度上其他 JavaScript 引擎)中優化非同步函式與 Promise,並描述我們如何改進非同步程式碼的除錯體驗。
在 V8 中實現排序
Array.prototype.sort
是 V8 中以自託管 JavaScript 實現的最後一個內建函數之一。重構它使我們有機會嘗試不同的算法和實現策略,並最終在 V8 v7.0 / Chrome 70 中使其穩定。
提升 V8 中 `DataView` 性能
DataView
是 JavaScript 中進行低層記憶體訪問的兩種途徑之一,另一種是 TypedArray
。直到現在,DataView
在 V8 中的優化程度遠低於 TypedArray
,導致在圖形密集型工作負載或編解碼二進制數據等任務中性能偏低。這些原因主要是歷史選擇,例如 asm.js 選擇了 TypedArray
而非 DataView
,因此引擎專注於提升 TypedArray
的性能。