2026-05 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
Needs-consensus PR: use Numbers instead of reals as counters in Iterator builtins (#3776, slides) | Michael Ficarra Array は array index (最大値$ 2^{32} - 2) を、ArrayBuffer (Uint8Array) は integer index (最大値$ 2^{53} - 1= Number.MAX_SAFE_INTEGER) まで扱えるが、Iterator は上限がない(無限に扱える)。Iterator のビルトインメソッドのカウンターを扱う API では最終的に number にキャストされるので$ 2^{53} - 1を上限とする Normative Change。
https://gyazo.com/1f95a3889cbe61ed5b17b984034f563d
承認された。
Stage 4 (ES2027)
2つ Normative Change が入った。
Firefox fuzzing によってレアなタイムゾーンでエッジケースが見つかった。今後も Normative Change が必要そう。
sosukesuzuki さん曰く JSC にも Temporal は既に実装されているが、仕様上曖昧になっているものが fuzzing でいくつか見つかっているので、現在はそれをなんとかしているフェーズ。
Iterator.zip{,Keyed} の提案。
code: js
Iterator.zip([
]).toArray();
Stage 4 になった 🎉
スピンロックする提案。引数でヒントとしてスピンする回数を指定する機能が取り除かれた。
Stage 4 になった 🎉
スコープを抜けたときに明示的にリソースを解放する using の提案。
条件付き Stage 4 だったのが、無事 Stage 4 になった 🎉
Stage 3
import source の提案。tc39/ecma262#3775 の Editorial Change に伴って、Source Phase Imports の PR の code: js
import source foo from 'foo';
export { foo };
で ExportEntryが [[ImportName]]: ~source~ となってしまうバグが生じたので Normative Change が必要となった。
Content Security Policy の Trusted Types TrustedScript のための提案。
2024-04 の TC39 meeting で ToString を呼ばないこととなったが、new Function に EvalLike を渡したときに ToString が実行されるようにブラウザは実装されてしまった。提案を ToString 呼び出しするのに戻すか、ブラウザの実装を修正するか。 ToString を呼び出さない Normative Change の方が支持されたので、実装の方を修正することとなった。
Error.prototype.stack の標準化。
Stage 3 になった。
Intl.NumberFormat で末尾のゼロを保持する提案。
Stage 3 になった。
Iterator.prototype.chunks の提案。
code: js
let chunksOf2 = Array.from(digits().chunks(2));
Stage 3 になった。
Iterator.prototype.join の提案。
Stage 3 になった。
Iterator.prototype.includes の提案。
Stage 3 になった。
RegExp の multiline モードで ^ と $ が行頭、行末を意味してしまうため、文字列の先頭、末尾を意味する \A と \z を追加する提案。
Stage 3 になった。
他の言語の正規表現にある \Z について。末尾の前に一つ改行がある場合にもマッチするのが \z と違う。
https://gyazo.com/6433a576dc83b570c8aa15230bc1bc6f
これも RegExp Buffer Bounaries の提案に組み込まれることとなった。
Stage 2.7
test262 が不十分。どのエンジンも ship 出来ていない。アクティブな champion も不在。
Stage 2.7 に降格(Decorator Metadata も同様に降格)。
ModuleSource を特定の Realm に関連付けするのをやめる方 #61 は承認されたが、シリアライズ、デシリアライズされて別の ModuleSource オブジェクトになった際に別のネームスペースオブジェクトを返すかどうかの方 #58 はまた保留となった。 Stage 2
Web Integration を進めている。
イベントに関して今まで EventTarget やそれに類する API を対象としていたが、"event-dispatching APIs" とする。
イベントのディスパッチを大きく3つに分類する
同期ディスパッチ: EventTarget#dispatchEvent など
外部からのディスパッチ: ユーザーインタラクションのように非 JS からの呼び出し
非同期ディスパッチ: Web API で非同期に呼び出されるもの
今後は WebIDL, HTML, DOM 側の仕様策定を進める。
いくつの細かい修正が入った。
プロトタイプ汚染や Proxy に耐性を持つ安全な Promise.resolve を実現する提案。JS から扱えるように提供するかどうか(内部にとどめておくか)、そして提供するならそれはどんな API なのかが議論中。
Promise.resolve に第二引数で strict: boolean を追加する?
https://gyazo.com/7e04efb4ee7fdc8a639860c91be5b067
JS API を生やすなら、それは別提案でということになった。
単位付きの数値を扱うクラス。単位変換できる。
code: js
let a = new Amount(42.87, { unit: "kilogram" });
let b = a.convertTo({
unit: "pound",
fractionDigits: 1
});
b.toLocaleString("en"); // "94.5 lb"
API 細部は先送りにするが、問題設定は十分共有されて Stage 2 になった。
Intl.DataTimeFormat に一番ベーシックなフォーマット文字列を出力する "zxx" ロケールを追加する提案。
Stage 2 になった。
Intl.NumberFormat で "5 feet, 11 inches" のように複数の単位を扱いたいことがある。これを追加する提案。format メソッドに渡すのはオブジェクトということになった。
code: js
const nf = new Intl.NumberFormat('en-US', {
style: 'unit',
unit: 'foot-and-inch',
});
// "5 feet, 11 inches"
nf.format({ foot: 5, inch: 11 });
Stage 2 になった。
Stage 1
サプライチェーン攻撃対策のため、単一の Realm に対して、複数のグローバル環境を扱えるようにする提案。
import('specifier', { scope: {} }) として特定モジュールに対してグローバルスコープを差し替えるようにするかもしれない。
アップデートとして、今まで同一 Realm 内に新しいグローバルオブジェクトを増やせるようになっていたが、ModuleEnvironmentRecord と GlobalEnvironmentRecord の結合を切ることで、グローバルオブジェクトを増やさない方向を目指しているらしい。
Intl.Collator や Intl.Segmenter などに対して、未決定(Undetermined)を意味する "und" を追加する提案。Stage 2 Stable Format の "zxx" は言語的内容なし(Non-linguistic content)でまた違うらしい。
もし "zxx" をサポートしていない Intl API に対して "zxx" を指定した場合、"und" にフォールバックする。
Stage 1 になった。
オブジェクトなどの比較機能をネイティブに入れる提案。
https://gyazo.com/3cff0116cb778a9635ca5e45c1c01c17
Stage 1 になった。
export * from に default エクスポートを追加したい提案。
現状 default は単に取り除かれるようになっている。両方をエクスポートしようとすると SyntaxError になる。
code: js
// SyntaxError
export * from "./src/index.js";
export { default } from "./src/index.js";
もしインポート側でネームスペースオブジェクトに default プロパティを生やすように変更したとして、それが Break the Web を引き起こすかもしれない。もしかしたら export ** from で default を追加することになるかも?(正直嫌)
https://gyazo.com/ec8678a6a68deacf5f9c94777d1f3e04
一旦は調査が必要ということでまとまって Stage 1 になった。
Stage 0
N/A
Withdrawn
isTemplateObject status update and possible withdrawal | Jordan Harband & Zbyszek Tenerowicz Trusted Types のために必要という扱いだったが特に強いニーズも感じられないということで Reflect.isTemplateObject が廃止。
その他
Tooling for navigating the ECMA-262 specification and reviewing API proposals (slides, repo) | Alberto Tontoni, Mikhail Barash Nav262 というシングルバイナリで ECMA-262 の仕様をレビューしやすくするツールを作っている話。
Iterator の提案の足並みを揃える。
agreeing to consider impact of RegExp proposals to linear implementations (slides) | Aurèle Barrière, Clément Pit-Claudel, Michael Ficarra, Mikhail Barash ECMAScript の正規表現は線形時間であることを保証しない。そのため ReDoS 脆弱性が起きてしまう。
https://gyazo.com/e2a19785ef2aa6d8f04830fa45234565
ちなみに V8 は独自の l フラグを付けることでヒューリスティックに線形時間を保証できない正規表現を弾くことが出来る。これを標準にしてもいいかもしれない。
https://gyazo.com/999d3d4f71122b74aca9cb40797bc155
An introduction to the EU CRA & how it matters to all of you (20 min) + Q&A (40 min) | Aki Rose Braun (slides) 2027年12月から全面適用される EU サイバーレジリエンス法(Cyber Resilience Act)があり、EU 向けにデバイスやソフトウェアを輸出する場合に適切にセキュリティ管理や脆弱性報告をしないといけなくなる。
言語仕様のような OSS に対してなにか問題があった場合に罰金は課されないだろうが、JS を使った製品で問題があった企業はそうではない。ECMAScript に仕様的な脆弱性があった場合に(過去にあった)、適切に報告しないといけなくなるかもしれない。
総括
今回は using が Stage 4 になり、いくつかの Iterator や Intl の提案が進んだ。
正規表現の線形時間実装性についての議論が興味深かった。ReDoS 対策として Worker 内でタイムアウトするしか無いと思っていたので、もっと CS 寄りの解決方法が提供されると嬉しい。
EU の Cyber Resilience Act についての話題が出たが、法的なものが言語仕様にまで派生してくるのはおそれがあるのが怖い。