2022-07 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
BigInt のコンストラクタで引数に対して ToPrimitive が2回呼ばれてしまう問題の修正。承認された。
Base クラスでコンストラクタにやってきた引数のオブジェクトを返すことによって、任意のオブジェクトに Private Fields を付与出来ることが報告されている。
code: js
class Base {
constructor(arg) {
return arg;
}
}
class ClassWithPrivateField extends Base {
constructor(arg) {
super(arg);
}
}
new ClassWithPrivateField(cross_origin_iframe.contentWindow);
この問題に対応するため Host-defined Object に対して Private Fields を扱えないように HostEnsureCanAddPrivateElement を追加し、リジェクト可能にする修正。承認された。
その後この ECMAScript の修正もと、HTML Standard において WindowProxy と Location オブジェクトではリジェクトするように修正された。
AsyncIterable なオブジェクトが Promise.resolve({ value: Promise.reject(), done: false }) を返すときに、それを yield* すると例外として扱ってしまう問題の修正。承認された。
RegExp のフラグを確認するときに直接 RegExp#global や RegExp#unicode を使うのではなく、RegExp#flags から該当するフラグが付与されているかをチェックするように変更する修正。承認された。
ビルトイン函数に対して Function#toString を実行したときに computed property name を表示する修正。
Stage として進めていくこととなった。
仕様の中に ECMA-262 と ECMA-402 の関係を明記する修正。承認された。
Stage 4 (ES2023)
CLI 環境のためにファイルの先頭に #! がある場合に JavaScript のランタイムとしてはコメントアウトとして扱う提案。Stage 4 になった 🎉
Stage 3
{Resizable, Growable}ArrayBuffer を追加する提案。
TypedArray#transfer の中で IsDetachedBuffer を使ってチェックするタイミングを修正。
Record & Tuple のメソッドを Array と TypedArray に取り込む提案。
提案の一部として進んでいた TypedArray#spliced を取り除く話になり、消す方向で進んだ。
Remove Order Check in NumberFormat v3 and in ECMA402 Intl.DateTimeFormat (slides, PR701, PR100) | Frank Yung-Fong Tang (Google) Intl.NumberFormat#formatRange{,ToParts}, Intl.PluralRules#Range そして Intl.DateTimeFormat#formatRange{,ToParts} のように範囲を扱う函数の引数において、引数の順番チェックを行っていたバリデーションを取り除いた。
Date や Time を扱う新しいインターフェースを提供する提案。
今回も多くの修正が行われた。IETF による会議が 7/25 に行われ、少しずつ進んでいるとのこと。
Intl.NumberFormat に formatRange を追加したりや useGrouping オプションを拡張したりする提案。
ところどころ修正が入ったとのこと。
RegExp の named capturing の重複を許可する提案。Stage 3 になった。
これが入ると以下のような正規表現が書けるようになる。
code: js
Stage 2
Set に新たに集合演算のメソッドを追加する提案。
引数にやってきた SetLike なオブジェクトをどうやって判定するかが議論になっている。例えば引数のオブジェクトの "has" メソッドをそのまま使ってしまったとすると、Map でも実行できてしまうことになってしまう。@@setHas のような Well-Known Symbol を用意して、"has" メソッドのエイリアスとする方法などが提案されている。
新たに Iterator クラスを導入し、遅延リストとして扱うメソッドを追加する提案。
大きな変更点として、今まで Iterator Helpers のメソッドの返すインスタンスは "return", "throw" メソッドを元のソースイテレーターに転送するために保持していたが、これを廃止することになった。
新たに Immutable Data Structure を扱うプリミティブとして Record と Tuple を追加する提案。
WebIDL においてオブジェクト、配列を受け取る部分についてそれぞれ Record と Tuple を受け取れるようにする作業が行われており、WHATWG の方では Structured Clone 周りでの作業が行われている。 9月の TC39 meeting で Stage 3 を目指すとのこと。
新たに import module x from "<specifier>"; という構文を導入する提案。
WebAssembly には実行可能な WebAssembly.Instance と、依存などが解決していない WebAssembly.Module (Transferable) が存在しており、後者を明示的に取得することがモチベーションとなっている。Stage 2 になった。
Stage 1
後ろから値を取れるイテレーターを作れるようにする提案。
今のところ新たに "nextLast" メソッドを追加することを想定しているっぽい。
ShadowRealm よりも強力に、モジュールに import hook を与えたり、locale などを操作した環境で実行することができる Compartment クラスの提案。
今まではすべて Compartment クラスに押し込んでいたが、機能を分割して Module, ModuleSource そして Evaluators クラスに分けるようにしたとのこと。
Symbol の static メソッドとして新たに Symbol.is{Registered, WellKnown} を導入する提案。
Symbols as WeakMap keys の提案において、GC によって消されることのない Symbol は WeakMap のキーとして扱えないという方針になったため、それを識別するメソッドが必要となった。Stage 1 になった。
新たに最大容量の決まった Map, Set を導入し、cache eviction できるようにする提案。
{LIFO, LRU, FIFO, LFU}{Set, Map} を追加する提案となっている。Stage 1 になった。
code: js
const cache = new LIFOMap(256);
const fnMemo = expensiveFn.memo(cache);
// Only the first fnMemo(0) calls expensiveFn; the second fnMemo(0) looks up
// the result of the first call in the cache.
Function#memo を導入し、メモ化する方法を提供する提案。Stage 1 になった。
code: js
function f (x) { console.log(x); return x * 2; }
const fMemo = f.memo();
fMemo(3); // Prints 3 and returns 6.
fMemo(3); // Does not print anything. Returns 6.
fMemo(2); // Prints 2 and returns 4.
fMemo(2); // Does not print anything. Returns 4.
fMemo(3); // Does not print anything. Returns 6.
Object.{pick, omit} を導入する提案。Stage 1 になった。
Stage 0
Function.{pipe, flow} を導入する提案。Stage 1 にはならなかった。
code: js
Function.pipe(input, ...fns);
// f2(f1(f0(5))).
Function.pipe(5, f0, f1, f2);
// 5.
Function.pipe(5);
// undefined.
Function.pipe();
その他
会議に速記のプロを雇う話。
Intl FallbackSymbol: well-known or not? | Jordan Harband
総括
今回は既存の提案の変更点が共有されたり、また多くの新しい提案が Stage 1 に追加されたりするのが見受けられた。
Temporal は Stage 3 のはずだが前回同様かなり多くの変更点が入っていて、仕様が安定するのがいつになるのか気になる。