2023-01 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
Reducing Annex B monkey-patching (PR) | Kevin Gibbons Annex B はオプショナル扱いだが実情として全てのブラウザで実装されている。ECMA の本仕様に対してパッチを当てるように記述されてるのをやめたいという話。
Stage 4 (ES2023)
以前から提案されていた Symbol を Weak{Map, Set, Ref} のキーに出来るようにする提案。Well-known や Registered Symbol は GC されないため、キーにできないようになっている。Stage 4 になった 🎉
Array に非破壊的なメソッドを追加する提案。TypedArray についてはもともと splice がないのもあって toSpliced は取り除かれた。Stage 4 になった 🎉
Intl.NumberFormat を拡張する提案。
formatRange メソッドの追加
code: js
const nf = new Intl.NumberFormat("en-US", {
style: "currency",
currency: "EUR",
signDisplay: "always",
});
nf.formatRange(2.999, 3.001); // "~+€3.00"
useGrouping が今までの true/false だけではなく、文字列を受けとれるように
https://gyazo.com/e9802975e669c661d8762b0145e1ae47
丸めや精度についてのオプション追加
符号について負数のみ表示するオプションの追加
Stage 4 になった 🎉
Stage 3
JSON.parse の reviver callback にもとの文字列を渡し、自動で数値が丸められるのに対応する提案。また JSON.stringify にたいして JSON.rawJSON を追加する話も出てきている。
reviver でオブジェクトを書き換えたときに問題が起きるため、最初のデータ構造をスナップショットする Normative Change が承認された。
実装者からの要求から formatToParts の返す構造が Normative Change が出され、承認された。
Intl.Locale に calendars, collections, hourCycles, numberingSystems, textInfo, timeZones そして weekInfo の getter アクセサプロパティを追加する提案。
getter アクセサプロパティの代わりに getCalendars のようにメソッドにしたらどうかという話になり、その方向になりそう。
明示的にリソースを開放するために using を追加する提案。
Normative Change として using を使っている場合に await を変数として扱えないようになった。また Top-Level eval で using が扱えないようになった。
code: js
eval("using x = getResource();"); // throws Error
eval("{ using x = getResource(); }"); // valid
Discuss SuppressedError argument overlap: error and cause (issue) | Jordan Harband Explicit Resource Management で新たに NativeError に追加される SuppressedError がある。これは
code: js
try {
throw new Error("c");
} catch (e) {
e;
}
に対して
code: js
SuppressedError {
error: Error("a"), // from resource 'a'
suppressed: SuppressedError {
error: Error("b"), // from resource 'b'
suppressed: Error("c"), // from the body
}
}
を返すためのやつ。
SuppressedError が cause プロパティを持っているとかなりややこしくなるため、コンストラクタのオプションとして cause を受け取らなくするように修正された。
シンタックスについて議論されている。
Which declaration form most clearly expresses the following semantics:
🔸 The value of binding (x) will be disposed when control flow exits the containing block scope
🔸 This disposal will happen asynchronously & will be awaited before continuing
シンタックスが解決したら Stage 3 になる(条件付き Stage 3 扱い)。
Parallel async iterators via a tweak to iterator helpers (slides, proposal) | Kevin Gibbons Stage 3 Iterator Helpers において AsyncIterator が提案からスプリットされて Stage 2 になった。
Normative Change がほとんど落ち着いた。後は IETF での進捗まち状態。
ArrayBuffer#transfer を追加する提案。
Stage 3 Resizable ArrayBuffers に対応するために、常に非 Resizable な ArrayBuffer を返す ArrayBuffer#transferToFixedLength や、ArrayBuffer#detached getter アクセサプロパティも追加される。Stage 3 になった。
Decorator context.access object API (issue) | Ron Buckton Decorator Context の access のメソッド群が、そのインターフェイス的に Function#call をつかって receiver (this) を明示的に渡さないといけないようになっていて扱いにくい。引数として渡せるようにしたいという Normative Change。
code: diff
type DecoratorContext = {
kind: string;
name: string | symbol;
static: boolean;
private: boolean;
access: {
- get(): any;
- set(value): void;
+ get(target): any;
+ set(target, value): void;
+ has(target): boolean;
},
addInitializer(cb: Function): void;
}
承認された。
Decorators and export Ordering (issue, slides) | Daniel Rosenwasser, Ron Buckton Decorators において export の後ろに decorators を記述することになっていたが、今になって TypeScript 側から強い懸念が呈されて再議論されることになった。
結果として export 前に記述してもいいことになったが、一つの宣言内で export 前後どちらか一方しか使えない制限を課される。また export 前に記述した場合 Function#toString からは消されることとなった。
Stage 2
JSON や CSS を ES Modules でインポートできるようにする提案。HTML の仕様において Content Security Policy など、モジュールのファイルフォーマットが扱われることがあるため assert キーワードは適していないのではないかという話になり、Stage 2 に下がった。
予定としては2-4ヶ月以内にシンタックスとセマンティックを決めるとのこと。
Temporal.Calendar を拡張する提案。Stage 2 になった。
Stege 4 Symbol as WeakMap keys から派生して Symbol が GC されない Registered や Well-Known かどうかを判定できるスタティックメソッドを追加する提案。
code: js
Symbol.isRegistered(symbol);
Symbol.isWellKnown(symbol);
Stage 2 になった。
Stage 1
instinsic を簡単に取得できるようにする提案。エンジンのメモリの問題が発覚したため Stage 2 にならなかった。
今まで度々提案されては懸念により Stage 1 にならなかった Async Contexts が Stage 1 になった。
おそらく Node.js の AsyncLocalStorage が Cloudflare Workers に取り込まれ、その流れで WinterCG で標準化作業がされているので、それが影響しているものだと思われる。 Stage 1 になったが、どういうインターフェースで提供するか決まってない状況ではあるので、すぐに実装したい場合は AsyncLocalStorage の方を入れるように勧告されている。
プロトタイプ汚染を悪用した攻撃に対抗する提案。
Out-of-band, like HTTP header or Node flag?
"use secure"?
enableSecureMode()?
Auto opt in when using new reflection APIs?
どのような形になるかはまだわからないがとりあえず Stage 1 になった。
その他
TC39’s consensus process を厳格化する提案。
https://gyazo.com/b70f47dc67a1cc246ed6140cdbb36569
Documenting Stage 3 proposals which are not ready to ship (PR, slides) | Daniel Ehrenberg Stage 3 の提案は Ready to Ship として扱われているが、最近は実装してみて問題が発覚し pending されているものも少なくない。その状態の提案がわかるようにドキュメント化したいという話。
Deno の kt3k さんによると Temporal の Normative Change が激しかったので、JavaScriptCore の実装者が対応に追われて大変だったらしい。
総括
今回はいろいろなものが Stage 4 となった。特に Change Array by Copy は実用的ですぐに使えるものだと思う。
Temporal の Normative Change が落ち着いて安心したが、Stage 3 ということで実装を開始したもののその激しい変化に振り回された実装者たちの苦労は計り知れない。お疲れさまでした……。
Import Assetions が Stage 2 に落ちた。V8 系のランタイムやバンドラーで既に使われている機能だったのもあって影響が大きそうだ。これについては特に注視していく必要があると思った。