2026-01 の TC39 meeting
まとめ
Agenda: https://github.com/tc39/agendas/blob/main/2026/01.md
速報: https://x.com/robpalmer2/status/2014298317040058745
Note: https://github.com/tc39/notes/tree/main/meetings/2026-01
決まったこと
Web compatibility issues / Needs Consensus PRs
Normative: Add 1 new numbering system "tols" for Unicode 17 #1035 | Shane F. Carr
Unicode 17 で新しくインド東部などで使われるトロン・シキ文字が入ったのでその numbering system をサポートする Normative Change。承認された。
Stage 4 (ES2026)
Upsert for Stage 4 (Slides) (PR#3740) | Daniel Minor
Map, WeakMap に getOrInsert{Computed} メソッドを入れる提案。Stage 4 になった 🎉
Stage 3
Temporal update and needs-consensus PRs (slides) | Philip Chimento
Firefox に続いて、Chrome 144 に ship された。
https://gyazo.com/744f9ba5c513548b351b12644cd0c260
その他 Temporal.PlainYearMonth の減算処理などに Normative Change が入った。
JavaScriptCore については Igalia の Tim Chevalier さんが実装している。実装としてはほとんど終わっているが、レビューの都合上少しずつ JavaScriptCore に取り込まれている状況らしい。
https://blogs.igalia.com/compilers/2026/02/02/implementing-the-temporal-proposal-in-javascriptcore/
余談だがふぁぼんさんによる実用的な polyfill(ponyfill としても扱える)が公開されている。
https://github.com/fabon-f/temporal-polyfill-lite
Intl Era/Month Code for Stage 3 (slides, PR #99, PR #101, PR #102, PR #108) | Ben Allen
Temporal に ISO 8601 以外の暦を入れる提案。いくつかの Nomative Change がある。
日本の和暦では明治5年10月23日からグレゴリオ暦が採用されている(それまでは天保暦が使われていた)。混乱を避けるため明治5年以前は ISO 8601 暦として扱う Normative Change が入った。
https://github.com/tc39/proposal-intl-era-monthcode/pull/102
その他の話題としてサポートする暦を明示的に列挙することとなり、 月の影を実測する必要のある "islamic-rgsa" (ヒジュラ暦の一種)をサポートしないことが決まった。また Temporal.Plain* の toLocaleString がタイムゾーンに影響されてしまうバグの修正などの Normative Change が入った。
Stage 3 になった。これによって Temporal を Stage 4 にするブロッカーではなくなった。
Stage 2.7
N/A
Stage 2
Withdraw function.sent | Jordan Harband
Generator の next メソッドに渡した値は GeneratorFunction の yield で受け取ることが出来る。しかしまだ一度も next が呼ばれていない場合 GeneratorFunction の yield まで到達していないため値を受け取ることが出来ない。これを解決するために function.sent メタプロパティを入れる提案。
長い事停滞となっていたため、廃止しないか議論されたが Jordan Harband さんが進めると明言したことで継続となった。
deferred re-exports update (slides) | Nicolò Ribaudo
前回、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 がネームスペースインポートでは(明示的に指定されていないとして)読み込みを起こさない
今回の会議で特に結論は出なかった。
Import Sync for Stage 2 (slides) | Guy Bedford
非ブラウザランタイムに非標準な同期モジュール読み込み API(import.meta.require など)が入ることでエコシステムで問題を起こさないように import.sync を追加する提案。
ホストによる差異(ブラウザのメインスレッドでは例外を出す)、デッドロックが起きる懸念や他の提案との整合性などが議論された。
Stage 2 になった。Stage 2.7 にするには上記懸念や実装者の支持が必要になる。
Stage 1
Error option limit for Stage 1 | Ruben Bridgewater
Error コンストラクタのオプションに limit を追加することで、スタックトレースの行数の上限を指定できるようにする提案。
V8 では非標準の Error.stackTraceLimit で制御できるが、グローバルではなくエラーオブジェクトごとに設定できるところにメリットがある。
Stage 1 になった。
Error option framesAbove for Stage 1 | Ruben Bridgewater
Error のコンストラクタのオプションに、callable 函数を渡す framesAbove を追加することで、スタックトレースからその函数を含めた上位のトレースを取り除く提案。
code: js
function wrap() {
throw Error("foo error", { framesAbove: wrap });
}
別の提案として標準化が進められている V8 拡張の Error.captureStackTrace に渡すオプションを Error コンストラクタにも追加する形になる。
Stage 1 になった。
Composable value-backed accessors for Stage 1 (slides) | Lea Verou
クラスのアクセサプロパティに新しいシンタックスを導入することで記述しやすくする提案。
まず現状の確認として Stage 3 Decorators により accessor キーワードを使ってアクセサプロパティ(get, set)の定義が書きやすくなっている。
code: js
class C {
accessor n = 1;
}
この提案では、プロパティにオブジェクトを持つ場合、そのオブジェクトの任意のプロパティに対してエイリアスとしてアクセサプロパティを設定することが出来るようになる。
code: js
class C {
#foo = new Signal(1);
alias foo = #foo.value;
}
他にもセッターにバリデーターや正規化する機能を追加する。
code: js
class C {
accessor foo = 0;
validate foo (value) {
return !Number.isNaN(value);
}
normalize foo (value) {
return Number(value);
}
}
後者についてはビルトインデコレーターを用意する形でも良いかもしれないと議論され、その方向になった。
提案が Alias Accessor と Composable Accessors via built-in decorators にスプリットされ、それぞれ Stage 1 になった。
Stage 0
N/A
Withdrawn
Withdrawing Intl.UnitFormat | Chris de Almeida
放置されていた Intl.UnitFormat の提案が廃止された。今日では同様の機能が Intl.NumerFormat v3 で既に扱える。
その他
Stage 3 Proposal Review (Stage 2/2.7 time permitting) | Peter Klecha
その他 Stage 3(時間があれば Stage 2/2.7 も)の提案の現状確認。
Stage 3 Legacy RegExp features in JavaScript
実装者の関心がなく進んでこなかったが、SpiderMonkey の実装が進んだこともあって継続。
Stage 3 Dynamic Code Brand Checks
Content Security Policy の Trusted Types (TrustedScript) に必要な提案。Firefox には出荷済みの状態。
Stage 3 Atomics.pause
次回の会議で Stage 4 になる可能性が高い。
Stage 3 Source Phase Imports & Stage 2.7 ESM Phase Imports
SpiderMonkey が Source Phase Imports (WebAssembly 用の import source)を実装済み。ESM Phase Imports(JS 用の import source)も着手予定で順調に進んでいそう。
Stage 2 Iterator.range
会議には出てないが issues 上で議論が活発的に行われている。SpiderMonkey に半完成の実装があるとのこと。
Stage 2 Discard (void) binding & Stage 2 Extractors & Stage 2 Structs & Stage 2 throw expressions
champion である Ron Buckton さんが去年 Microsoft をレイオフされた都合で停滞したが、どれも継続する意欲がある。
Structs については実装者側の共同 champion が不足がボトルネックになっている。Extractors はパターンマッチングとの連動が、throw expressions は再整理が必要。
Stage 2 Propagate active ScriptOrModule with JobCallback Record
ECMAScript と HTML の実装挙動不一致問題を解消するために必要。優先度は高くないものの AsyncContext と並走して進める。
Stage 2 Reflect.isTemplateObject
champion の Jordan Harband さん的にあまり進められていない。共同 champion が欲しいという話になったが、特に現れず。
Stage 2 Module Declarations & Stage 2 Module Expressions
Source Phase Imports & ESM Phase Imports(import source)の提案によってブロックされている状況。
Stage 2 JSON.parseImmutable
Records & Tuple が廃止されたため Composites との関係で待機中。Composites champion の Ashley Claymore さんに確認を取る必要がある。
Stage 2 Symbol Predicates
以前 Symbol.isRegistered については特に懸念はないが、Symbol.isWellKnown に対して懸念が出されていた。提案を分割するかもしれない。
Stage 2 String.dedent
以前 Stage 2.7 にする方向で進めていたが停滞状態にある。champion による再コミットが必要。
Stage 2 Dynamic import host adjustment
Dynamic Code Brand Checks に置き換わった古い提案のはず。Krzysztof Kotowicz さんに確認を取る必要がある。
Stage 2 RegExp buffer boundaries
正規表現で先頭と末尾を表す ^ と $ は m(multiline)フラグでは行の先頭、末尾として扱われてしまう。m フラグでも全体の先頭と末尾を表す \A と \z を追加する提案。
Stage 1 Atomic Operators などとの優先順位を含めて TG3(Security)で進める。
Stage 2 Destructure Private Fields
以前構文競合の懸念が出されていたが解消されていない。会議に champion がいないので特に廃止までには至らなかった。この提案に関心を持つ人もいたことから継続。
Stage 2 Pipeline Operator
Hack スタイル と F# スタイルで揉めている。そもそもパイプライン演算子自体要らないという意見もある。現状停滞している理由の一つとしてプレースホルダー(トピックトークン)をどうするかで自転車乗り場の議論状態になっている。
code: js
// トピックトークンとして ^^ を採用した場合
Object.keys(envars)
.map(envar => ${envar}=${envars[envar]})
.join(' ')
|> $ ${^^}
|> chalk.dim(^^, 'node', args.join(' '))
|> console.log(^^);
進めるには設計を確定させることと実装者の説得の両方が必要。
Stage 2 Function implementation hiding
エラー系の提案とともに進める方針。
Stage 2 Collection Nomalization
一定の支持があり継続。
総括
今回は停滞している提案の振り返りがメインだった。
Upsert が Stage 4 になった。Temporal が Chrome, Firefox で使えるようになり、ブロッカーになっていた Intl Era/Month Code も無事 Stage 3 になったことから、次の会議で Stage 4 になりそうで嬉しい。
新しい提案として Error のコンストラクタにスタックトレースに関するオプションが追加された。今まで V8 の独自仕様がベースとなって他のエンジンにも実装されていたのが、扱いやすい形で標準化される方向になったのが良い。
#ECMAScript