2025-02 の TC39 meeting
まとめ
Agenda: https://github.com/tc39/agendas/blob/main/2025/02.md
速報: https://x.com/robpalmer2/status/1892725231749358007
Note: https://github.com/tc39/notes/tree/main/meetings/2025-02
決まったこと
Web compatibility issues / Needs Consensus PRs
Don't call well-known Symbol methods for RegExp on primitive values | Gus Caplan, Luca Casonato
自分が提案して議題に出すようにお願いしていた Normative Change。String.prototype に定義されている文字列と正規表現のいずれも渡せるメソッドで、プリミティブのプロトタイプ汚染で悪いことができてしまう問題の修正。
詳しくは Zenn に記事を書いてある。
https://zenn.dev/pixiv/articles/47ffaf53e7d664
承認された 🎉
Stage 4 (ES2025)
Float16Array for stage 4 (spec PR) | Kevin Gibbons
自分が ponyfill を書いて進めていた Float16Array の提案。
https://inside.pixiv.blog/2023/10/19/130000
8年弱かかって Stage 4 になった 🎉
Redeclarable global eval vars for stage 4 (spec PR) | Shu-yu Guo
eval 内で宣言した変数を let/const で再定義するのを検知するために仕様が複雑になっていた。その制限を取り払う提案。Stage 4 になった 🎉
RegExp Escaping for stage 4 (spec PR) | Jordan Harband
文字列から RegExp を作るときに使われる RegExp.escape の提案。Stage 4 になった 🎉
Stage 3
Explicit Resource Management Needs Consensus PR (PR) | Ron Buckton
{Async}DisposableStack.prototype の constructor プロパティを設定し忘れていたのを修正。
Temporal normative PR and status update (slides) | Philip Chimento
MDN にドキュメントが追加され、実装も進んできた。
https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Temporal
https://gyazo.com/a2810c5a81495ec50d8cda75a0b45364
現状はふぁぼんさんの記事が詳しい。ICU4C/ICU4X の不一致問題がバグとして表出している。
https://zenn.dev/fabon/articles/e9d4610722b660
その後なんとかなったらしい。
@syobon_hinata: そういえばTemporalのICU4C/ICU4X暦計算不一致問題は「ICU4Xに処理を委譲するカスタムカレンダーを作る」という方法でICU4Xに暦計算を統一して乗り切るみたいです (鮮やかな解決策……)
https://t.co/x2ujE8KzbJ
Intl Locale Info API Update in Stage 3 (PR, slides) | Frank Yung-Fong Tang
CLDR からの要請で getWeekInfo() から minimalDays が取り除かれた。
Decorators implementation updates (slides) | Kristen Hewell Garrett
実装が進められているが、V8 と SpiderMonkey が最初に出荷するのを躊躇しており、提案としては進んでいない。
提案者の悲痛の声が……。
yeah, I guess just I put five years of my life into this now, and on and off, obviously, but I’d really like to see it get over the line. Yeah.
Import Defer for Stage 3 (tests: all PRs linked to #4215, slides) | Nicolò Ribaudo
WebKit で実装が進められており、エコシステムとしては Babel や Prettier でサポートされている状態にある。Stage 3 になった。
TypeScript サポートが進められている。早く入ってほしい。
https://github.com/microsoft/TypeScript/pull/60757
Stage 2.7
ShadowRealm status update (slides) | Philip Chimento
crypto.subtle がイベントループに依存しているらしく、ShadowRealm で扱えない件についてどうするが議論されている。
Immutable ArrayBuffer for stage 2.7 (slides.key, slides.pdf) | Mark Miller
Agoric と Modabble XS が進めている提案。前回からの追加として sliceToImmutable(start?: number, end?: number): ArrayBuffer が追加されている。Stage 2.7 になり、HTML の構造化クローンアルゴリズムが Stage 3 のブロックとなる。
Stage 2
Records & Tuples future directions (slides) | Ashley Claymore
Records & Tuples をオブジェクトにするとして今後どうするかが議論されている。Map/Set のキーとして扱えるようにする話も出ている。
なかなか提案が進んでなかったが、とりあえず議論が再開しそう。
Error Stack Accessor for stage 1 or 2 | Jordan Harband
Errar.prototype.stack を標準化する提案。Stage 2 になった。
Stage 1
Limited ArrayBuffer update: stay on stage 1 or withdraw? (slides) | Jack Works
2021年に提案された Limited ArrayBuffer だが、Stage 1 のまま残留するか withdrown にするか議論された。引き続き Stage 1 として議論することとなった。
Stabilize integrity traits status update (slides.key, slides.pdf, video) | Mark Miller
前回の会議で提案されていたオブジェクトに新たに stabllize 状態を付与し、さまざまな仕様バグを解消する提案。
https://gyazo.com/daaf6a663426674f909d83460dd7513e
今回はそれぞれに状態に対して、具体的にどういった挙動になるのか提案された。
https://gyazo.com/59aab8ff71df72e74e8a57653f9666ac
https://gyazo.com/be3fcfc570f9b10b8ac274887016433c
https://gyazo.com/e9c944964d9c5eae955ef4aab9136446
https://gyazo.com/920d5188d620b8c2a4357bfda6e56671
https://gyazo.com/35b009d1b847b79cfa8bd26e413343df
sloppy mode では overridable の修正は技術的に困難なため、strict mode のみに限定される。
A unified vision for measure and decimal (slides) (continuation slides) | Jesse Alama, Eemeli Aro, Shane F Carr
Measure と Decimal を統一する提案が議論された。否定的。
Stable Formatting update (PR, slides) | Eemeli Aro
Intl に "zxx" (null) ロケールを追加する提案。各 Intl クラスに対してどういう挙動をさせるべきかが議論されている。特に Intl.Collator や Intl.Segmenter はロケールに依存するため、どうするべきか考える必要がある。
Math.clamp for Stage 1 or 2 (slides) | Oliver Medhurst
Math.clamp(value, min, max) を追加する提案。CSS の clamp 関数と引数の順番が違うのが注意点。
具体的な仕様はまだ決まっておらず、Number のプロトタイプに入れるかもしれない。Stage 1 になった。
Error.captureStackTrace (slides) for Stage 1 | Matthew Gaudet
Mozilla からの提案。V8 の独自実装だった Error.captureStackTrace だが、2023/08 に JavaScriptCore に実装され、SpiderMonkey にも実装したいと考えている。それにあたって標準仕様がほしいという話。Stage 1 になった。
Curtailing the power of "Thenables" (slides) for Stage 1 | Matthew Gaudet
Thenable をどうにかしたい話。2024年に Thenable によって引き起こされた CVE-2024-43357 脆弱性の修正が迫られたり、エンジンでもいくつか脆弱性が見つかっている。
https://gyazo.com/1c213d0f02cb77c1d82fb94d1e3a3a4b
具体的にどうするかは決まらなかったが、脆弱性リスクを軽減させるために不格好であっても何らかの変更を加えるべきということで支持され、Stage 1 になった。
Thenable については Symbol.thenable など、度々なんとかしたいという提案が話題に上がるが、今回はちゃんと進むのだろうか。
Stage 0
Number.isSafeNumeric (slides) for Stage 1 | ZiJian Liu
文字列から number に変換する際に、Number, Number.parseInt, Number.parseFloat の一貫性がない問題があったり、ユーザーランドでバリデーション函数を用意する状態になっている。安全な数値文字列を定義し、その判定を標準化したい話。
"安全"とはなにかをちゃんと明確にしないと
Stage 1 にできないという話になった。
Withdrown
N/A
その他
Secretariat comments (slides)
TC55 (WinterTC) に次いで、TC56 で新たに AI をやっていくらしい。IBM, ServiceNow, Microsoft, Hitachi や大学などが関わっていくとのこと。
また2025年の ECMA の経営陣として Daniel Ehrenberg さんがプレジデントに選出された。
https://ecma-international.org/history/#:~:text=17%20June%201961.-,Presidents,-C.%20G.%20Holland
Decision Making through Consensus - take 2 | Michael Saboff
TC39 の提案は形式的に合議制を取っているが、現実的には単一の参加者からの拒否の影響を受けてしまう。
Language design goal for consensus: Things should layer (slides) | Daniel Ehrenberg
JSSuger (JS0) について。基本的に JavaScript の糖衣構文であるべきで、そうでない場合はその利点がコストを上回る必要があることが議論され、条件付きコンセンサスを得た。
総括
今回の会議をもって ES2025 に入る提案が凍結され、次から ES2026 となる。
個人的に進めていた Normative Change と Float16Array が入って、堂々と ECMAScript コントリビューターを名乗ることができるようになりそうで喜ばしい。他には Deffered Import が思っていたよりも早く Stage 3 になり、停滞していた Stage 2 Record & Tuple の議論が再開された。このあたりは特に注視していきたい。
#ECMAScript