2025-02 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
自分が提案して議題に出すようにお願いしていた Normative Change。String.prototype に定義されている文字列と正規表現のいずれも渡せるメソッドで、プリミティブのプロトタイプ汚染で悪いことができてしまう問題の修正。
詳しくは Zenn に記事を書いてある。
承認された 🎉
Stage 4 (ES2025)
自分が ponyfill を書いて進めていた Float16Array の提案。
8年弱かかって Stage 4 になった 🎉
eval 内で宣言した変数を let/const で再定義するのを検知するために仕様が複雑になっていた。その制限を取り払う提案。Stage 4 になった 🎉
文字列から RegExp を作るときに使われる RegExp.escape の提案。Stage 4 になった 🎉
Stage 3
{Async}DisposableStack.prototype の constructor プロパティを設定し忘れていたのを修正。
MDN にドキュメントが追加され、実装も進んできた。
https://gyazo.com/a2810c5a81495ec50d8cda75a0b45364
現状はふぁぼんさんの記事が詳しい。ICU4C/ICU4X の不一致問題がバグとして表出している。
その後なんとかなったらしい。
@syobon_hinata: そういえばTemporalのICU4C/ICU4X暦計算不一致問題は「ICU4Xに処理を委譲するカスタムカレンダーを作る」という方法でICU4Xに暦計算を統一して乗り切るみたいです (鮮やかな解決策……) CLDR からの要請で getWeekInfo() から minimalDays が取り除かれた。
実装が進められているが、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.
WebKit で実装が進められており、エコシステムとしては Babel や Prettier でサポートされている状態にある。Stage 3 になった。
TypeScript サポートが進められている。早く入ってほしい。
Stage 2.7
Agoric と Modabble XS が進めている提案。前回からの追加として sliceToImmutable(start?: number, end?: number): ArrayBuffer が追加されている。Stage 2.7 になり、HTML の構造化クローンアルゴリズムが Stage 3 のブロックとなる。
Stage 2
Records & Tuples をオブジェクトにするとして今後どうするかが議論されている。Map/Set のキーとして扱えるようにする話も出ている。
なかなか提案が進んでなかったが、とりあえず議論が再開しそう。
Errar.prototype.stack を標準化する提案。Stage 2 になった。
Stage 1
2021年に提案された Limited ArrayBuffer だが、Stage 1 のまま残留するか withdrown にするか議論された。引き続き Stage 1 として議論することとなった。
前回の会議で提案されていたオブジェクトに新たに 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 のみに限定される。
Measure と Decimal を統一する提案が議論された。否定的。
Intl に "zxx" (null) ロケールを追加する提案。各 Intl クラスに対してどういう挙動をさせるべきかが議論されている。特に Intl.Collator や Intl.Segmenter はロケールに依存するため、どうするべきか考える必要がある。
Math.clamp(value, min, max) を追加する提案。CSS の clamp 関数と引数の順番が違うのが注意点。
具体的な仕様はまだ決まっておらず、Number のプロトタイプに入れるかもしれない。Stage 1 になった。
Mozilla からの提案。V8 の独自実装だった Error.captureStackTrace だが、2023/08 に JavaScriptCore に実装され、SpiderMonkey にも実装したいと考えている。それにあたって標準仕様がほしいという話。Stage 1 になった。
Thenable をどうにかしたい話。2024年に Thenable によって引き起こされた CVE-2024-43357 脆弱性の修正が迫られたり、エンジンでもいくつか脆弱性が見つかっている。 https://gyazo.com/1c213d0f02cb77c1d82fb94d1e3a3a4b
具体的にどうするかは決まらなかったが、脆弱性リスクを軽減させるために不格好であっても何らかの変更を加えるべきということで支持され、Stage 1 になった。
Thenable については Symbol.thenable など、度々なんとかしたいという提案が話題に上がるが、今回はちゃんと進むのだろうか。
Stage 0
文字列から number に変換する際に、Number, Number.parseInt, Number.parseFloat の一貫性がない問題があったり、ユーザーランドでバリデーション函数を用意する状態になっている。安全な数値文字列を定義し、その判定を標準化したい話。
"安全"とはなにかをちゃんと明確にしないと
Stage 1 にできないという話になった。
Withdrown
N/A
その他
TC55 (WinterTC) に次いで、TC56 で新たに AI をやっていくらしい。IBM, ServiceNow, Microsoft, Hitachi や大学などが関わっていくとのこと。 また2025年の ECMA の経営陣として Daniel Ehrenberg さんがプレジデントに選出された。
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 の議論が再開された。このあたりは特に注視していきたい。