我們一起聊聊ECMAScript 提案最新的進(jìn)展
大家好,我是 CUGGZ。
2023 年 1 月 30 日至 2 月 2 日,第 94 次 TC39 會議在線舉行,下面來看看在這次會議中哪些 ECMAScript 提案取得了新進(jìn)展!
TC39 是一個推動 JavaScript 發(fā)展的技術(shù)委員會,由各個主流瀏覽器廠商的代表構(gòu)成,其主要工作就是制定 ECMAScript 標(biāo)準(zhǔn)。TC39 每兩個月舉行一次會議。
對于新提案,從提出到最后被納入 ECMAScript 新特性,TC39 的規(guī)范中分為五步:
- stage0(strawman),任何TC39的成員都可以提交。
- stage1(proposal),進(jìn)入此階段就意味著這一提案被認(rèn)為是正式的了,需要對此提案的場景與API進(jìn)行詳盡的描述。
- stage2(draft),這一階段的提案如果能最終進(jìn)入到標(biāo)準(zhǔn),那么在之后的階段都不會有太大的變化,因為理論上只接受增量修改。
- state3(candidate),這一階段的提案只有在遇到了重大問題才會修改,規(guī)范文檔需要被全面的完成。
- state4(finished),這一階段的提案將會被納入到ES每年發(fā)布的規(guī)范之中。
Stage 4
- Change Array by Copy[1]:在 Array.prototype 和 TypedArray.prototype 上提供額外的方法(toReversed()、toSorted()、toSpliced()、with()),通過返回數(shù)組的新副本和更改來啟用數(shù)組的更改,避免再操作數(shù)組時修改原數(shù)組;
- Intl.NumberFormat V3[2]:擴(kuò)展Intl.NumberFormat,解決一些痛點問題。
- Symbols as WeakMap keys[3]:允許 Symbol 作為 WeakMaps 中的鍵,并在 WeakRef 和 FinalizationRegistry 中支持 Symbol。
Stage 3
- ArrayBuffer transfer[4]:建議添加“ArrayBuffer.prototype.transfer”(transfer,transferToFixedLength,detached),用以轉(zhuǎn)移 ArrayBuffers 的所有權(quán)、優(yōu)化重新分配以及將可調(diào)整大小的 ArrayBuffers 固定為固定長度的 ArrayBuffers。
Stage 2
- Import Assertions[5]:使用斷言導(dǎo)入 ES 模塊的語法提案,用以解決模塊類型與其MIME類型不符的情況(注意:該提案已從第 3 階段降級);
- Intl era/monthCode[6]:Temporal 僅對 ISO8601 時間格式與 UTC 時區(qū)下的行為做了明確定義,對 ISO8601 以外的時間格式和 UTC 以外的時區(qū),只提供了最基本的定義,該提案旨在對這些規(guī)范細(xì)節(jié)進(jìn)行進(jìn)一步的完善;
- Symbol Predicates[7]:提出了兩個區(qū)分 symbol 的方法:Symbol.isRegistered(symbol)、Symbol.isWellKnown(symbol);
Stage 1
- Async Context[8]:提供一種機(jī)制來跟蹤 JavaScript 中的異步上下文,它影響目前 Node.js Async Hooks,Async Storage 等能力的性能和接口,對 Node.js 無感知鏈路追蹤的實現(xiàn)有著重大意義。
- Proto pollution mitigation[9]:通過引入一種安全模式來防止原型污染,該模式只允許通過方法或 symbol 鍵訪問原型,而不是字符串屬性鍵。這旨在通過使原型更難被惡意操縱來提高安全性。
提案鏈接
[1] Change Array by Copy: https://github.com/tc39/proposal-change-array-by-copy
[2] Intl.NumberFormat V3: https://github.com/tc39/proposal-intl-numberformat-v3
[3] Symbols as WeakMap keys: https://github.com/tc39/proposal-symbols-as-weakmap-keys
[4] ArrayBuffer transfer: https://github.com/tc39/proposal-arraybuffer-transfer
[5] Import Assertions: https://github.com/tc39/proposal-import-assertions
[6] Intl era/monthCode: https://github.com/tc39/proposal-intl-era-monthcode
[7] Symbol Predicates: https://github.com/tc39/proposal-symbol-predicates
[8] Async Context: https://github.com/tc39/proposal-async-context
[9] Proto pollution mitigation: https://github.com/syg/proposal-symbol-proto
往期推薦: