2026-05 の TC39 meeting
まとめ
Agenda: https://github.com/tc39/agendas/blob/main/2026/05.md
速報: https://x.com/robpalmer2/status/2057921326875078776
Note: https://github.com/tc39/notes/pull/411
決まったこと
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)
Temporal progress update (slides) | Philip Chimento
2つ Normative Change が入った。
Firefox fuzzing によってレアなタイムゾーンでエッジケースが見つかった。今後も Normative Change が必要そう。
sosukesuzuki さん曰く JSC にも Temporal は既に実装されているが、仕様上曖昧になっているものが fuzzing でいくつか見つかっているので、現在はそれをなんとかしているフェーズ。
Joint Iteration for Stage 4 (ecma262 PR, slides) | Michael Ficarra
Iterator.zip{,Keyed} の提案。
code: js
Iterator.zip([
0, 1, 2,
3, 4, 5,
]).toArray();
Stage 4 になった 🎉
Atomics.pause for Stage 4 (ecma262 PR, Normative PRs: Drop hint parameter, Make 0 hint special) | Keith Miller
スピンロックする提案。引数でヒントとしてスピンする回数を指定する機能が取り除かれた。
Stage 4 になった 🎉
Explicit Resource Management Stage 4 progress update (ecma262 PR, slides) | Ron Buckton
スコープを抜けたときに明示的にリソースを解放する using の提案。
条件付き Stage 4 だったのが、無事 Stage 4 になった 🎉
Stage 3
Source Phase Imports normative change to resolve ambiguous export spec bug #75 in #76 along with tc39/ecma262#3775 (slides) | Guy Bedford
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 が必要となった。
Dynamic Code Brand Checks (ecma262 PR, proposal) for stage 4, or normative change (PR #23) (slides) | Nicolò Ribaudo
Content Security Policy の Trusted Types TrustedScript のための提案。
2024-04 の TC39 meeting で ToString を呼ばないこととなったが、new Function に EvalLike を渡したときに ToString が実行されるようにブラウザは実装されてしまった。提案を ToString 呼び出しするのに戻すか、ブラウザの実装を修正するか。
ToString を呼び出さない Normative Change の方が支持されたので、実装の方を修正することとなった。
Error stack accessor for stage 3 | Jordan Harband
Error.prototype.stack の標準化。
Stage 3 になった。
Intl: Keep Trailing Zeros for Stage 3 (slides) | Eemeli Aro
Intl.NumberFormat で末尾のゼロを保持する提案。
Stage 3 になった。
Iterator Chunking for Stage 3 (#30, tests) | Michael Ficarra
Iterator.prototype.chunks の提案。
code: js
const digits = () => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.values();
let chunksOf2 = Array.from(digits().chunks(2));
// [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
Stage 3 になった。
Iterator Join for Stage 3 (tests) | Kevin Gibbons
Iterator.prototype.join の提案。
Stage 3 になった。
Iterator Includes for Stage 3 (#14, tests) | Michael Ficarra
Iterator.prototype.includes の提案。
Stage 3 になった。
RegExp Buffer Boundaries for Stage 2.7 or 3 (slides, test262 PR) | Ron Buckton
RegExp の multiline モードで ^ と $ が行頭、行末を意味してしまうため、文字列の先頭、末尾を意味する \A と \z を追加する提案。
Stage 3 になった。
Postpone adoption of \Z for RegExp Buffer Boundaries (issue) | Ron Buckton
他の言語の正規表現にある \Z について。末尾の前に一つ改行がある場合にもマッチするのが \z と違う。
https://gyazo.com/6433a576dc83b570c8aa15230bc1bc6f
これも RegExp Buffer Bounaries の提案に組み込まれることとなった。
Stage 2.7
Decorators for Stage 2.7 (slides) | Daniel Minor
test262 が不十分。どのエンジンも ship 出来ていない。アクティブな champion も不在。
Stage 2.7 に降格(Decorator Metadata も同様に降格)。
ESM Phase Imports normative PRs (slides, PRs #58 & #61) | Guy Bedford
前回 2026-03 の TC39 meeting#69de5d8d00000000004bf5ec の続きが議論されている。
ModuleSource を特定の Realm に関連付けするのをやめる方 #61 は承認されたが、シリアライズ、デシリアライズされて別の ModuleSource オブジェクトになった際に別のネームスペースオブジェクトを返すかどうかの方 #58 はまた保留となった。
Stage 2
AsyncContext web integration status update (slides) | Nicolò Ribaudo & Andreu Botella
Web Integration を進めている。
イベントに関して今まで EventTarget やそれに類する API を対象としていたが、"event-dispatching APIs" とする。
https://github.com/tc39/proposal-async-context/blob/master/WEB-INTEGRATION.md#events
イベントのディスパッチを大きく3つに分類する
同期ディスパッチ: EventTarget#dispatchEvent など
外部からのディスパッチ: ユーザーインタラクションのように非 JS からの呼び出し
非同期ディスパッチ: Web API で非同期に呼び出されるもの
今後は WebIDL, HTML, DOM 側の仕様策定を進める。
https://github.com/tc39/proposal-async-context/issues/152
export defer Stage 2 status update (slides) | Nicolò Ribaudo & Caio Lima
いくつの細かい修正が入った。
Thenable Curtailment status update (slides) | Matthew Gaudet
プロトタイプ汚染や Proxy に耐性を持つ安全な Promise.resolve を実現する提案。JS から扱えるように提供するかどうか(内部にとどめておくか)、そして提供するならそれはどんな API なのかが議論中。
Promise.resolve に第二引数で strict: boolean を追加する?
https://gyazo.com/7e04efb4ee7fdc8a639860c91be5b067
JS API を生やすなら、それは別提案でということになった。
Amount for Stage 2 (slides, spec) | Eemeli Aro & Jesse Alama
単位付きの数値を扱うクラス。単位変換できる。
code: js
let a = new Amount(42.87, { unit: "kilogram" });
let b = a.convertTo({
unit: "pound",
fractionDigits: 1
});
b.value, b.unit; // "9.45e+1", "pound"
b.toLocaleString("en"); // "94.5 lb"
API 細部は先送りにするが、問題設定は十分共有されて Stage 2 になった。
Stable Formatting for Stage 2 (slides, spec) | Eemeli Aro
Intl.DataTimeFormat に一番ベーシックなフォーマット文字列を出力する "zxx" ロケールを追加する提案。
Stage 2 になった。
Intl Sequence Units for Stage 1 or 2 (Slides, Spec) | Shane F Carr
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
module global status update (slides) | Zbigniew Tenerowicz
サプライチェーン攻撃対策のため、単一の Realm に対して、複数のグローバル環境を扱えるようにする提案。
import('specifier', { scope: {} }) として特定モジュールに対してグローバルスコープを差し替えるようにするかもしれない。
アップデートとして、今まで同一 Realm 内に新しいグローバルオブジェクトを増やせるようになっていたが、ModuleEnvironmentRecord と GlobalEnvironmentRecord の結合を切ることで、グローバルオブジェクトを増やさない方向を目指しているらしい。
Default Behaviours for some Intl APIs for Stage 1 (slides) | Eemeli Aro & Henri Sivonen
Intl.Collator や Intl.Segmenter などに対して、未決定(Undetermined)を意味する "und" を追加する提案。Stage 2 Stable Format の "zxx" は言語的内容なし(Non-linguistic content)でまた違うらしい。
もし "zxx" をサポートしていない Intl API に対して "zxx" を指定した場合、"und" にフォールバックする。
Stage 1 になった。
Comparisons for Stage 1 (slides) | Jacob Smith
オブジェクトなどの比較機能をネイティブに入れる提案。
https://gyazo.com/3cff0116cb778a9635ca5e45c1c01c17
Stage 1 になった。
export all from for Stage 1 (slides) | Nicolò Ribaudo
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 の仕様をレビューしやすくするツールを作っている話。
discussion/feedback around Iterator-related proposal roadmap | Michael Ficarra
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
これに対して言語仕様側でなにか出来るかもしれない。新しい正規表現に関する提案で考慮するだとか、線形時間な正規表現かどうかを JS 側で知れる API を用意するとか(Ruby には Regexp.linear_time? があるらしい)。
ちなみに 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 についての話題が出たが、法的なものが言語仕様にまで派生してくるのはおそれがあるのが怖い。
#ECMAScript