2022 年 6 月 22 日,第 123 屆 Ecma 大會批準了 ECMAScript 2022 語言規范[1],這意味著它現在正式成為標準。
1 ECMAScript 2022編輯
本次發布的編輯有:
-
Shu-yu Guo[2]
-
Michael Ficarra[3]
-
Kevin Gibbons[4]
2 ECMAScript 2022有什么新內容?
2.1 新的class成員
class?MyClass?{instancePublicField?=?1;static?staticPublicField?=?2;#instancePrivateField?=?3;static?#staticPrivateField?=?4;#nonStaticPrivateMethod()?{}get?#nonStaticPrivateAccessor()?{}set?#nonStaticPrivateAccessor(value)?{}static?#staticPrivateMethod()?{}static?get?#staticPrivateAccessor()?{}static?set?#staticPrivateAccessor(value)?{}static?{//?靜態初始化代碼塊}
}
-
可以通過以下方式創建公共屬性 (public slots) :
-
實例公有屬性[5]
-
靜態公有屬性[6]
-
-
私有屬性[7]是新的,可以通過以下方式創建:
-
私有屬性 (實例私有屬性[8]?and?靜態私有屬性[9])
-
私有方法和訪問器 (非靜態[10]?和?靜態[11])
-
-
靜態初始化代碼塊[12]
2.2 使用?in
?操作符檢查私有屬性
這個操作也被成為 “人性化檢查私有屬性的方式”. 后面的表達式就是示例 –他檢查?obj
?是否有一個私有屬性?#privateSlot
:
#privateSlot?in?obj
這是個完整例子
class?ClassWithPrivateSlot?{#privateSlot?=?true;static?hasPrivateSlot(obj)?{return?#privateSlot?in?obj;}
}const?obj1?=?new?ClassWithPrivateSlot();
assert.equal(ClassWithPrivateSlot.hasPrivateSlot(obj1),?true
);const?obj2?=?{};
assert.equal(ClassWithPrivateSlot.hasPrivateSlot(obj2),?false
);
請注意,我們只能在聲明它的范圍(scope)內引用私有屬性。
更多關于私有屬性檢查的資料[13]
2.3 模塊中的頂層await
我們現在可以在模塊的頂層使用 await 并且不再需要輸入異步函數或方法
// my-module.mjs
const response = await fetch('https://example.com');
const text = await response.text();
console.log(text);
更多頂層await資料[14]
2.4?error.cause
Error及其子類現在可以讓我們指定哪個錯誤導致了當前錯誤:
try {// Do something
} catch (otherError) {throw new Error('Something went wrong', {cause: otherError});
}
導致當前錯誤的?err
?會顯示在調用堆棧中。而且可以通過?err.cause
進行訪問
更多關于error.cause
[15]
2.5 可索引值方法 .at()
方法?.at()
?讓我們可以讀取給定索引處的元素 (就像?[]
) 而且支持負數 (與?[]
不同):
> ['a', 'b', 'c'].at(0)
'a'
> ['a', 'b', 'c'].at(-1)
'c'
以下“可索引”類型具有?.at()
方法:
-
string
-
Array
-
所有的Typed Array :?
Uint8Array
?等.
2.6 RegExp match 指數
如果我們給正則添加標志?/d
?, 使用它生成匹配對象,就會記錄每個組捕獲的開始和結束索引(A 行和 B 行):
const?matchObj?=?/(a+)(b+)/d.exec('aaaabb');assert.equal(matchObj[1],?'aaaa'
);
assert.deepEqual(matchObj.indices[1],?[0,?4]?//?(A)
);assert.equal(matchObj[2],?'bb'
);
assert.deepEqual(matchObj.indices[2],?[4,?6]?//?(B)
);
更多關于RegExp match indices[16]
2.7?Object.hasOwn(obj, propKey)
Object.hasOwn(obj, propKey)
?提供了一個安全的方式檢查對象?obj
?是否有鍵為?propKey
的自有(非繼承的) 屬性:
const?proto?=?{protoProp:?'protoProp',
};
const?obj?=?{__proto__:?proto,objProp:?'objProp',
}assert.equal('protoProp'?in?obj,?true);?//?(A)assert.equal(Object.hasOwn(obj,?'protoProp'),?false);?//?(B)
assert.equal(Object.hasOwn(proto,?'protoProp'),?true);?//?(C)
請注意,in?
檢測繼承的屬性(A 行),而?Object.hasOwn()
?僅檢測自己的屬性(B 和 C 行)。
3 FAQ
3.1 ?JavaScript 和 ECMAScript有什么區別?
-
長話短說版——通俗地說:
-
JavaScript 是由各種平臺(瀏覽器、Node.js、Deno 等)實現的編程語言。
-
ECMAScript是他的標準, 如?the ECMAScript language specification[17]所描述。
-
-
長話長說版, 參閱?section “Standardizing JavaScript” in “JavaScript for impatient programmers”[18].
3.2 誰設計ECMAScript?TC39 – Ecma Technical Committee 39
ECMAScript 由標準組織?Ecma International?的技術委員會 39 (TC39)?設計。
其成員嚴格來說是公司:Adobe、Apple、Facebook、Google、Microsoft、Mozilla、Opera、Twitter 等。?也就是說,通常是競爭對手的公司正在合作開發 JavaScript。
每兩個月,TC39 都會召開由成員指定的代表和受邀專家參加的會議。?這些會議的記錄在?GitHub 倉庫[19]中是公開的。
在會議之外,TC39 還與 JavaScript 社區的各種成員和團體合作。
3.3 新特性是如何被記入ECMAScript 中的??它們經歷了 TC39 的那些流程?
新的ECMAScript 特性必須選TC39提交提案,會經歷以下幾個階段:
-
從階段 0(使 TC39 能夠對提案發表評論)
-
到第 4 階段(提議的功能已準備好添加到 ECMAScript 中)
一旦一個特性達到第 4 階段,它就會被計劃添加到 ECMAScript 中。ECMAScript 版本的功能集通常在每年的 3 月凍結。?在截止日期之后達到第 4 階段的功能將添加到明年的 ECMAScript 版本中
有關更多信息,請參閱section “The TC39 process” in “JavaScript for impatient programmers”[20].
3.4 ECMAScript 的版本有多重要?
自從 TC39 流程建立以來,ECMAScript 版本的重要性已經大大降低。?現在真正重要的是提議的功能處于哪個階段:一旦達到第 4 階段,就可以安全地使用它。?但即便如此,你仍然需要檢查你的目標引擎是否支持它。
3.5 我最喜歡/關注的xx提案什么進展了?
如果你想知道各種提議的功能處于什么階段,請參閱 TC39 提議庫[21]。
3.6 在哪里可以查看給定 ECMAScript 版本中添加了哪些功能?
有幾個地方我們可以查看每個 ECMAScript 版本中的新內容:
-
在 “JavaScript for impatient programmers”, 有一個章節?列出了每個 ECMAScript 版本中新增內容[22]。同時還附上了解釋的連接。
-
TC39 庫有一個表格,其中包含已完成的提案[23],其中說明了它們已經(或將要)引入的 ECMAScript 版本。
-
ECMAScript 語言規范的“介紹”[24]部分列出了每個 ECMAScript 版本的新特性。
-
ECMA-262 有一個release頁面[25].
3.7 免費的JavaScript 在線書籍
-
“JavaScript for impatient programmers (ES2022 edition)”[26]?涵蓋直到ECMAScript 2022 的 JavaScript
-
“Deep JavaScript: Theory and techniques”[27]?更深入地涵蓋語言基礎。
參考資料
[1]第 123 屆 Ecma 大會批準了 ECMAScript 2022 語言規范: https://www.ecma-international.org/news/ecma-international-approves-new-standards-6/
[2]Shu-yu Guo: https://twitter.com/_shu
[3]Michael Ficarra: https://twitter.com/smooshMap
[4]Kevin Gibbons: https://twitter.com/bakkoting
[5]實例公有屬性: https://exploringjs.com/impatient-js/ch_classes.html#instance-public-fields
[6]靜態公有屬性: https://exploringjs.com/impatient-js/ch_classes.html#static-public-fields
[7]私有屬性: https://exploringjs.com/impatient-js/ch_classes.html#private-slots
[8]實例私有屬性: https://exploringjs.com/impatient-js/ch_classes.html#instance-private-fields
[9]靜態私有屬性: https://exploringjs.com/impatient-js/ch_classes.html#static-private-methods-accessors-fields
[10]非靜態: https://exploringjs.com/impatient-js/ch_classes.html#private-methods-accessors
[11]靜態: https://exploringjs.com/impatient-js/ch_classes.html#static-private-methods-accessors-fields
[12]靜態初始化代碼塊: https://exploringjs.com/impatient-js/ch_classes.html#class-static-initialization-blocks
[13]更多關于私有屬性檢查的資料: https://exploringjs.com/impatient-js/ch_classes.html#private-slot-checks
[14]更多頂層await資料: https://exploringjs.com/impatient-js/ch_modules.html#top-level-await
[15]更多關于error.cause: https://exploringjs.com/impatient-js/ch_exception-handling.html#error.cause
[16]更多關于RegExp match indices: https://exploringjs.com/impatient-js/ch_regexps.html#regexp-match-indices
[17]the ECMAScript language specification: https://tc39.es/ecma262/
[18]section “Standardizing JavaScript” in “JavaScript for impatient programmers”: https://exploringjs.com/impatient-js/ch_history.html#standardizing-javascript
[19]GitHub 倉庫: https://github.com/tc39/tc39-notes/
[20]section “The TC39 process” in “JavaScript for impatient programmers”: https://exploringjs.com/impatient-js/ch_history.html#tc39-process
[21]請參閱 TC39 提議庫: https://github.com/tc39/proposals/
[22]列出了每個 ECMAScript 版本中新增內容: https://exploringjs.com/impatient-js/ch_new-javascript-features.html
[23]已完成的提案: https://github.com/tc39/proposals/blob/main/finished-proposals.md
[24]“介紹”: https://tc39.es/ecma262/#sec-intro
[25]release頁面: https://github.com/tc39/ecma262/releases
[26]“JavaScript for impatient programmers (ES2022 edition)”: https://exploringjs.com/impatient-js/
[27]“Deep JavaScript: Theory and techniques”: https://exploringjs.com/deep-js/
[28]參考原文: https://2ality.com/2022/06/ecmascript-2022.html
- EOF -