跳至主要内容

16 篇文章 含有標籤「ECMAScript」

檢視所有標籤

瞭解 ECMAScript 規範,第 3 部分

· 閱讀時間約 11 分鐘
[Marja Hölttä](https://twitter.com/marjakh),推測規範觀察者

所有集數

在這一集中,我們將更深入地探討 ECMAScript 語言及其語法的定義。如果您不熟悉上下文無關文法,那麼現在正是了解基礎知識的好時機,因為規範使用上下文無關文法來定義語言。請參閱《Crafting Interpreters》中關於上下文無關文法的章節以獲得易於理解的介紹,或者查看維基百科頁面以獲得更數學化的定義。

理解 ECMAScript 規範,第2部分

· 閱讀時間約 11 分鐘
[Marja Hölttä](https://twitter.com/marjakh),推測規範觀察員

讓我們來多練習一些我們驚人的規範閱讀技巧。如果你還沒看過上一集,現在是個好機會!

所有篇章

準備好進入第2部分了嗎?

了解規範的一個有趣的方法是從我們已知的 JavaScript 功能入手,找出它是如何被規範定義的。

警告!本集包含來自 ECMAScript 規範(截至 2020 年 2 月)的複製粘貼算法,最終它們可能會過時。

我們知道屬性會在原型鏈中查找:如果一個物件沒有我們試圖讀取的屬性,我們會沿著原型鏈往上找到它(或找到一個不再有原型的物件)。

例如:

const o1 = { foo: 99 };
const o2 = {};
Object.setPrototypeOf(o2, o1);
o2.foo;
// → 99

原型鏈的查找定義在哪裡?

讓我們嘗試找出這種行為的定義位置。一個不錯的起點是 物件內部方法清單

這裡既有 [[GetOwnProperty]] 也有 [[Get]] ——我們關心的是不限於 自有 屬性的版本,所以我們選擇 [[Get]]

不幸的是,屬性描述符的規範類型 也有一個名為 [[Get]] 的欄位,因此在瀏覽規範時,我們需要小心區分這兩種不同的用法。

額外內容:「理解 ECMAScript 規格,第二部分」

· 閱讀時間約 3 分鐘
[Marja Hölttä](https://twitter.com/marjakh),投機規格觀察者

為什麼 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

AssignmentExpression : ConditionalExpression

(還有其他產生式,在這裡僅展示相關部分。)

ConditionalExpression 不必有條件交互操作(如 a == b ? c : d),它也可以僅僅是一個 ShortcircuitExpression

ConditionalExpression : ShortCircuitExpression

接下來:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

理解 ECMAScript 規範,第一部分

· 閱讀時間約 9 分鐘
[Marja Hölttä](https://twitter.com/marjakh),推測性規範觀察者

全部集數

在本文中,我們採用規範中的一個簡單函數,並嘗試理解其標記法。讓我們開始吧!

前言

即使您了解 JavaScript,也可能會覺得閱讀其語言規範,ECMAScript 語言規範,或簡稱 ECMAScript 規範,相當令人生畏。至少這是我第一次閱讀時的感受。

更快且功能更豐富的國際化 API

· 閱讀時間約 5 分鐘
[சத்யா குணசேகரன் (Sathya Gunasekaran)](https://twitter.com/_gsathya)

ECMAScript 國際化 API 規範 (ECMA-402 或 Intl) 提供了關鍵的區域特定功能,例如日期格式化、數字格式化、複數形式選擇和排序。Chrome V8 和 Google 國際化團隊合作為 V8 的 ECMA-402 實現添加功能,同時清理技術債務並改善效能和與其他瀏覽器的互操作性。

加速擴展元素

· 閱讀時間約 9 分鐘
Hai Dang & Georg Neis

在他於 V8 團隊的三個月實習期間,Hai Dang 專注於提升 [...array][...string][...set][...map.keys()][...map.values()] 的性能(當擴展元素位於數組字面量的開頭時)。他甚至還大幅提升了 Array.from(iterable) 的性能。本文解釋了他改進的部分詳細內容,這些更改從 V8 v7.2 開始被引入。

更快的非同步函式與 Promise

· 閱讀時間約 19 分鐘
Maya Armyanova([@Zmayski](https://twitter.com/Zmayski)),永遠處於等待狀態的預測者,以及 Benedikt Meurer([@bmeurer](https://twitter.com/bmeurer)),專業性能承諾者

JavaScript 中的非同步處理傳統上被認為速度並不特別快。更糟的是,對即時運行的 JavaScript 應用進行除錯——尤其是 Node.js 伺服器——並不容易,_特別是_涉及非同步程式時。不過幸運的是,時代正在改變。本文將探討我們如何在 V8(以及某種程度上其他 JavaScript 引擎)中優化非同步函式與 Promise,並描述我們如何改進非同步程式碼的除錯體驗。

在 V8 中實現排序

· 閱讀時間約 18 分鐘
Simon Zünd ([@nimODota](https://twitter.com/nimODota)), 一致的比較器

Array.prototype.sort 是 V8 中以自託管 JavaScript 實現的最後一個內建函數之一。重構它使我們有機會嘗試不同的算法和實現策略,並最終在 V8 v7.0 / Chrome 70 中使其穩定

提升 V8 中 `DataView` 性能

· 閱讀時間約 8 分鐘
Théotime Grohens, <i lang="fr">Data-Vue 的學者</i>, 以及 Benedikt Meurer ([@bmeurer](https://twitter.com/bmeurer)), 專業性能伙伴

DataView 是 JavaScript 中進行低層記憶體訪問的兩種途徑之一,另一種是 TypedArray。直到現在,DataView 在 V8 中的優化程度遠低於 TypedArray,導致在圖形密集型工作負載或編解碼二進制數據等任務中性能偏低。這些原因主要是歷史選擇,例如 asm.js 選擇了 TypedArray 而非 DataView,因此引擎專注於提升 TypedArray 的性能。