2025-05 の TC39 meeting
まとめ
Agenda: https://github.com/tc39/agendas/blob/main/2025/05.md
速報: https://x.com/robpalmer2/status/1928409242072977651
Note: https://github.com/tc39/notes/tree/main/meetings/2025-05
決まったこと
Web compatibility issues / Needs Consensus PRs
Normative: Add "Late Errors for Function Call Assignment Targets" to Annex B (#3568, slides) | Ross Kirsling
Web Reality として代入演算子の左辺に函数の CallExpression があった場合に、仕様通り Early Error を起こさず ReferenceError が起きるようになっている。
code: js
f() = 1;
f() *= 1;
f()++;
for (f() in 1) {}
for (f() of 1) {}
これを Annex B に記述する Normative Change。なお ES2021 Logical Assignments (&&= など)については各ブラウザはちゃんと Early Error になるらしい。承認された。
Normative: Added note about sets of locales for web browser implementations needing to not change as a result of user behaviour (ecma402#780, slides) | Ujjwal Sharma
以前から議論されていた、Intl によってフィンガープリンティングができてはいけない注釈を追加する Normative Change。承認された。
Normative: Add 8 new numbering systems for Unicode 16 (ecma402#929) | Ujjwal Sharma
Unicode 16 に伴って Intl.NumberFormat に numbering system を追加する Normative Change。承認された。
Normative: Add Intl.Locale.prototype.variants (ecma402#960, slides) | Richard Gibson
Intl.Locale に variants を追加する Normative Change。
https://gyazo.com/3cb9136ad99c6f133991578f569c1cad
承認された。
Stage 4 (ES2026)
Error.isError for Stage 4 | Jordan Harband
Stage 4 になった 🎉
余談だが、ようやく Node.js に DOMException 対応が入ってホッとした。
https://github.com/nodejs/node/issues/56497#event-18256778206
Explicit Resource Management for Stage 4 (spec pr, slides) | Ron Buckton
条件付き Stage 4 になった 🎉
test262 に入り次第、ECMA262 PR のレビューがされる。
レイオフされた Ron Buckton さんが会議に参加できたようで一安心。
Array.fromAsync for Stage 4 (spec pull request, slides) | J. S. Choi
条件付き Stage 4 になった 🎉
エディターの承認が入り次第 ES2026 に入る。
Stage 3
Intl Locale Info Stage 3 Update: Normative: Return undefined if direction is unknown (Slides | Shane F Carr
文字の方向に対する更新があった。オイラト語、モンゴル語のように縦書きで文字の方向が左右で表せない場合に undefined を返す。
https://gyazo.com/26f82d7899374d70b16dd945314f030c
Temporal status update and normative change (slides) | Philip Chimento
V8 が Boa の Temporal 実装である temporal_rs をベルゲン大学と協力して取り込もうとしている。
https://github.com/boa-dev/temporal
https://issues.chromium.org/issues/401065166
https://www.youtube.com/watch?v=WieD_9BswAE&t=1461s
test262 のカバー率だけを見ると V8 が急速に落ちているように見えるが、すぐに Boa と並ぶことが予想される。
https://chromium-review.googlesource.com/q/hashtag:"temporal"+(status:open%20OR%20status:merged)
https://gyazo.com/537cb58c18584c6a8b693d5e1def8aa9
Stage 2.7
Immutable ArrayBuffer for Stage 3 | Peter Hoddie, Richard Gibson
test262 へのテスト計画が進められている。その後 Stage 3 に進める予定。
Iterator Sequencing for Stage 3 (slides) | Michael Ficarra
test262 へテストが入った。
Stage 2
Iterator Chunking for Stage 2.7 (slides) | Michael Ficarra
Iterator.prototype.{window, chunks} メソッドにおいて、要素数が要求するサイズに満たない場合にどうするかが議論されている。
1. 値を返さない(現状維持)
2. next() メソッドが呼ばれた際に例外を投げる(PR #14)
3.サイズを変更せずに値を返す(PR #15)
4. 要素数が足りない分を undefined で埋める(PR #16)
5. オプションを追加して、ディベロッパーが挙動を選べるようにする
https://gyazo.com/ca22120c815f0a7f9ef4489156361f13
https://gyazo.com/6ab4319ef624e7bec1f401a49607f856
1 と 3 が有用ということになった。
その後 3 のために Iterator.prototype.sliding が追加された。
https://github.com/tc39/proposal-iterator-chunking/pull/21
AsyncContext web integration brainstorming (slides) | Andreu Botella
Mozilla がユースケースがニッチであること、API を使用するディベロッパーにとって複雑であること、実装が困難であることから反対している。
https://gyazo.com/62b3f0a6a3176dfe858fe1c2aee6b6eb
https://gyazo.com/c51a0952fb9ce1093a6106f7fcd29fc1
よって API ごとに AsyncContext をサポートするかどうかを議論している。
https://gyazo.com/470671c219cd70d628c70177664adf48
さらなる議論が必要ということになった。個人的に Zone.js を見ていると addEventListener 対応しないとなると、AsyncContext のユースケースが大きく減る気がするが大丈夫だろうか。
SeededPRNG for stage 2 (slides) | Tab Atkins-Bittner
シード付きで乱数を扱えるクラスを追加する提案。
code: ts
class SeededPRNG {
#state;
constructor(Uint8Array | Number) {}
static fromRandomSeed(): SeededPRNG {}
random(): Number {}
randomSeed(): Uint8Array {}
state(): Uint8Array {}
setState(Uint8Array): undefined {}
}
アルゴリズムとして ChaCha12 を使う。
https://github.com/tc39/proposal-seeded-random/issues/19
グローバルに SeededPRNG クラスを追加するのではなく、別の提案として新たに Random ネームスペースを追加する話があるため、Random.Seeded として提供することとなった。
Stage 2 になった。
Math.clamp for Stage 2 or 2.7 (slides) | Oliver Medhurst
Math.clamp として進めるか Number.prototype.clamp として進めるか議論された。
https://gyazo.com/e395cb00a47a2b5da4db1940e75e0cc6
Number の方に追加する方向で決まったらしい。Stage 2 になった。
Stage 1
Decimal stage 1 update (slides) | Jesse Alama
前回から引き続き trailing zeros を保持する Decimal.Amount を追加する方向で進めている。
code: js
const amount = Decimal.Amount.from("6.200");
amount.toString(); // "6.200"
amount.significantDigits; // 4
amount.fractionalDigits; // 3
amount.trailingZeroes; // 2
amount.with({ significantDigit: 3 }) // "6.20"
amount.with({ trailingZero: 1 }); // "6.20"
amount.with({ fractionalDigit: 0 }); // "6"
Stage 1 Measure との統合も考慮されている。
code: js
const a = new Decimal.Amount("5.613");
a.with({ unit: "kg" }); // 5.613 kilograms
a.with({ significantDigit: 5, unit: "kg" }); // 5.6130 kilograms
さらなる議論が必要ということになった。
IDL for ECMAScript with WebIDL (issue, slides) | Arai
Web 仕様と同様に ECMAScript も WebIDL を提供することで C++ binding を自動化したい話。
Keep trailing zeros in Intl.NumberFormat and Intl.PluralRules for Stage 1 (slides) | Eemeli Aro
現在 Intl.NumberFormat は trailing zeros を取り除いている。
code: js
const nf = new Intl.NumberFormat("en");
nf.format("1.0") === "1";
const pr = new Intl.PluralRules("en");
pr.select("1.0") === "one";
これを残すように変更する提案。
code: js
const nf = new Intl.NumberFormat("en");
nf.format("1.0") === "1.0";
const pr = new Intl.PluralRules("en");
pr.select("1.0") === "other";
Stage 1 になった。
More Random Functions for Stage 1 (slides) | Tab Atkins-Bittne
新たに Random ネームスペースを導入し、いろいろな函数を追加する提案。
code: ts
interface Random {
random(): number;
number(lo: number, hi: number, step?: number): number;
int(lo: number, hi: number, step?: number): number;
bigint(lo: bigint, hi: bigint, step?: bigint): bigint;
bytes(n: number): Uint8Array;
fillBytes(buffer: BufferType, start?: number, end?: number): BufferType;
// Collection Methods
shuffle<T>(arr: T[]): T[];
toShuffled<T>(coll: Iterable<T>): T[];
take<T>(coll: Iterable<T>, n: number, options?: object): T[];
sample<T>(coll: Iterable<T>, options?: object): T;
// Non-Uniform Distributions Methods
normal(mean?: number, stdev?: number): number;
lognormal(mean?: number, stdev?: number): number;
vonmisse(mean?: number, kappa?: number): number;
triangular(lo?: number, hi?: number, mode?: number): number;
exponential(lambda?: number): number;
binomial(n: number, p?: number): number;
geometric(p?: number): number;
hypergeometric(n: number, N: number, K: number): number;
beta(alpha: number, beta: number): number;
gamma(alpha: number, beta: number): number;
pareto(alpha: number): number;
weibull(alpha: number, beta: number): number;
}
Collection Methods や Non-Uniform Distributions Methods がスプリットされて、基本のメソッドが Stage 1 になった。
詳しくは Zenn に記事を書いた。
https://zenn.dev/pixiv/articles/e4501b8b419185
Comparisons (né "Assertions") for Stage 1 (slides) (slides - updated) | Jacob Smith
オブジェクトの値が等しいかどうかの API を追加したい話。
提案としてスコープが大きいため、以下の3つに分けることになった。
Inspector: オブジェクトの比較を人間が読みやすい形で提供する
Modes: さまざまな環境コードの特定のサブセットを条件付きで実行する
Comparisons: assert または expect のような機能で、Inspector と Modes が Stage 2 になった後に再検討する
このうち Inspector が Stage 1 になった。
Stage 0
N/A
Withdrown
N/A
その他
JS Numerics breakout session (slides)
Decimal を Stage 2 にするために、解決したい課題について議論された。Decimal.Amount についてや、文字列からの変換を Temporal のように Decimal.from にするか new Decimal にするかなど。
Proposed change to the agenda deadline | Chris de Almeida
Maintaining Proposal Topics (slides) | Mikhail Barash, J. S. Choi, Michael Ficarra
Moving TCQ forward (repo) | Christian Ulbrich
総括
今回は Error.isError、Explicit Resource Managements、そして Array.fromAsync が Stage 4 になった。
新しい提案としては Random ネームスペースを用いて、疑似乱数に関するユーティリティ函数、クラスが集約された。個人的には長いこと望んでいた配列のシャッフルが ECMAScript に入りそうなのが喜ばしい。
#ECMAScript