2026-01 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
Unicode 17 で新しくインド東部などで使われるトロン・シキ文字が入ったのでその numbering system をサポートする Normative Change。承認された。 Stage 4 (ES2026)
Map, WeakMap に getOrInsert{Computed} メソッドを入れる提案。Stage 4 になった 🎉
Stage 3
Firefox に続いて、Chrome 144 に ship された。
https://gyazo.com/744f9ba5c513548b351b12644cd0c260
その他 Temporal.PlainYearMonth の減算処理などに Normative Change が入った。
JavaScriptCore については Igalia の Tim Chevalier さんが実装している。実装としてはほとんど終わっているが、レビューの都合上少しずつ JavaScriptCore に取り込まれている状況らしい。
余談だがふぁぼんさんによる実用的な polyfill(ponyfill としても扱える)が公開されている。
Temporal に ISO 8601 以外の暦を入れる提案。いくつかの Nomative Change がある。
日本の和暦では明治5年10月23日からグレゴリオ暦が採用されている(それまでは天保暦が使われていた)。混乱を避けるため明治5年以前は ISO 8601 暦として扱う Normative Change が入った。
その他の話題としてサポートする暦を明示的に列挙することとなり、 月の影を実測する必要のある "islamic-rgsa" (ヒジュラ暦の一種)をサポートしないことが決まった。また Temporal.Plain* の toLocaleString がタイムゾーンに影響されてしまうバグの修正などの Normative Change が入った。
Stage 3 になった。これによって Temporal を Stage 4 にするブロッカーではなくなった。
Stage 2.7
N/A
Stage 2
Generator の next メソッドに渡した値は GeneratorFunction の yield で受け取ることが出来る。しかしまだ一度も next が呼ばれていない場合 GeneratorFunction の yield まで到達していないため値を受け取ることが出来ない。これを解決するために function.sent メタプロパティを入れる提案。
長い事停滞となっていたため、廃止しないか議論されたが Jordan Harband さんが進めると明言したことで継続となった。
前回、export defer しているモジュールがネームスペースインポートされた場合に import defer との相互作用が必要となること、モジュールの実行パスが静的グラフと遅延実行グラフで分かれてしまう仕様の複雑性の懸念から Stage 2.7 にならなかった。
https://gyazo.com/92440a2d67b65f235b813cf9181ba51e
https://gyazo.com/c9a2e19d94657d4c705d9e7ee0ddfc55
この問題を解決するため3つのオプションが提案された。
1. import defer 同様 export defer も実行にのみ影響し、読み込みには影響しない(通常通り読み込む)
2. ネームスペースインポートでリストアップする機能追加することで export defer しているモジュールがネームスペースインポートされていても、対象を指定できるようにする
import { other. some } as ns from ...
3. export defer がネームスペースインポートでは(明示的に指定されていないとして)読み込みを起こさない
今回の会議で特に結論は出なかった。
非ブラウザランタイムに非標準な同期モジュール読み込み API(import.meta.require など)が入ることでエコシステムで問題を起こさないように import.sync を追加する提案。
ホストによる差異(ブラウザのメインスレッドでは例外を出す)、デッドロックが起きる懸念や他の提案との整合性などが議論された。
Stage 2 になった。Stage 2.7 にするには上記懸念や実装者の支持が必要になる。
Stage 1
Error コンストラクタのオプションに limit を追加することで、スタックトレースの行数の上限を指定できるようにする提案。
V8 では非標準の Error.stackTraceLimit で制御できるが、グローバルではなくエラーオブジェクトごとに設定できるところにメリットがある。
Stage 1 になった。
Error のコンストラクタのオプションに、callable 函数を渡す framesAbove を追加することで、スタックトレースからその函数を含めた上位のトレースを取り除く提案。
code: js
function wrap() {
throw Error("foo error", { framesAbove: wrap });
}
別の提案として標準化が進められている V8 拡張の Error.captureStackTrace に渡すオプションを Error コンストラクタにも追加する形になる。
Stage 1 になった。
クラスのアクセサプロパティに新しいシンタックスを導入することで記述しやすくする提案。
まず現状の確認として Stage 3 Decorators により accessor キーワードを使ってアクセサプロパティ(get, set)の定義が書きやすくなっている。
code: js
class C {
accessor n = 1;
}
この提案では、プロパティにオブジェクトを持つ場合、そのオブジェクトの任意のプロパティに対してエイリアスとしてアクセサプロパティを設定することが出来るようになる。
code: js
class C {
}
他にもセッターにバリデーターや正規化する機能を追加する。
code: js
class C {
accessor foo = 0;
validate foo (value) {
return !Number.isNaN(value);
}
normalize foo (value) {
return Number(value);
}
}
後者についてはビルトインデコレーターを用意する形でも良いかもしれないと議論され、その方向になった。
Stage 0
N/A
Withdrawn
放置されていた Intl.UnitFormat の提案が廃止された。今日では同様の機能が Intl.NumerFormat v3 で既に扱える。
その他
Stage 3 Proposal Review (Stage 2/2.7 time permitting) | Peter Klecha
その他 Stage 3(時間があれば Stage 2/2.7 も)の提案の現状確認。
実装者の関心がなく進んでこなかったが、SpiderMonkey の実装が進んだこともあって継続。
Content Security Policy の Trusted Types (TrustedScript) に必要な提案。Firefox には出荷済みの状態。
次回の会議で Stage 4 になる可能性が高い。
SpiderMonkey が Source Phase Imports (WebAssembly 用の import source)を実装済み。ESM Phase Imports(JS 用の import source)も着手予定で順調に進んでいそう。
会議には出てないが issues 上で議論が活発的に行われている。SpiderMonkey に半完成の実装があるとのこと。
champion である Ron Buckton さんが去年 Microsoft をレイオフされた都合で停滞したが、どれも継続する意欲がある。
Structs については実装者側の共同 champion が不足がボトルネックになっている。Extractors はパターンマッチングとの連動が、throw expressions は再整理が必要。
ECMAScript と HTML の実装挙動不一致問題を解消するために必要。優先度は高くないものの AsyncContext と並走して進める。
champion の Jordan Harband さん的にあまり進められていない。共同 champion が欲しいという話になったが、特に現れず。
Source Phase Imports & ESM Phase Imports(import source)の提案によってブロックされている状況。
Records & Tuple が廃止されたため Composites との関係で待機中。Composites champion の Ashley Claymore さんに確認を取る必要がある。
以前 Symbol.isRegistered については特に懸念はないが、Symbol.isWellKnown に対して懸念が出されていた。提案を分割するかもしれない。
以前 Stage 2.7 にする方向で進めていたが停滞状態にある。champion による再コミットが必要。
Dynamic Code Brand Checks に置き換わった古い提案のはず。Krzysztof Kotowicz さんに確認を取る必要がある。
正規表現で先頭と末尾を表す ^ と $ は m(multiline)フラグでは行の先頭、末尾として扱われてしまう。m フラグでも全体の先頭と末尾を表す \A と \z を追加する提案。
以前構文競合の懸念が出されていたが解消されていない。会議に champion がいないので特に廃止までには至らなかった。この提案に関心を持つ人もいたことから継続。
Hack スタイル と F# スタイルで揉めている。そもそもパイプライン演算子自体要らないという意見もある。現状停滞している理由の一つとしてプレースホルダー(トピックトークン)をどうするかで自転車乗り場の議論状態になっている。
code: js
// トピックトークンとして ^^ を採用した場合
Object.keys(envars)
.map(envar => ${envar}=${envars[envar]})
.join(' ')
|> $ ${^^}
|> chalk.dim(^^, 'node', args.join(' '))
|> console.log(^^);
進めるには設計を確定させることと実装者の説得の両方が必要。
エラー系の提案とともに進める方針。
一定の支持があり継続。
総括
今回は停滞している提案の振り返りがメインだった。
Upsert が Stage 4 になった。Temporal が Chrome, Firefox で使えるようになり、ブロッカーになっていた Intl Era/Month Code も無事 Stage 3 になったことから、次の会議で Stage 4 になりそうで嬉しい。
新しい提案として Error のコンストラクタにスタックトレースに関するオプションが追加された。今まで V8 の独自仕様がベースとなって他のエンジンにも実装されていたのが、扱いやすい形で標準化される方向になったのが良い。