2022-07 の TC39 meeting
まとめ
Agenda: https://github.com/tc39/agendas/blob/master/2022/07.md
速報: https://dev.to/hemanth/updates-from-the-91th-tc39-meeting-779
Note: https://github.com/tc39/notes/blob/main/meetings/2022-07
決まったこと
Web compatibility issues / Needs Consensus PRs
Only coerce once in the BigInt constructor | Kevin Gibbons
BigInt のコンストラクタで引数に対して ToPrimitive が2回呼ばれてしまう問題の修正。承認された。
Allow host exotic objects to reject private fields | Kevin Gibbons
Base クラスでコンストラクタにやってきた引数のオブジェクトを返すことによって、任意のオブジェクトに Private Fields を付与出来ることが報告されている。
https://github.com/whatwg/html/issues/7952
code: js
class Base {
constructor(arg) {
return arg;
}
}
class ClassWithPrivateField extends Base {
#field = 1;
constructor(arg) {
super(arg);
}
}
new ClassWithPrivateField(cross_origin_iframe.contentWindow);
この問題に対応するため Host-defined Object に対して Private Fields を扱えないように HostEnsureCanAddPrivateElement を追加し、リジェクト可能にする修正。承認された。
その後この ECMAScript の修正もと、HTML Standard において WindowProxy と Location オブジェクトではリジェクトするように修正された。
https://github.com/whatwg/html/pull/8198
Avoid triggering throw in corner case in async generators or Avoid mostly-redundant await in async yield* - slides | Kevin Gibbons
AsyncIterable なオブジェクトが Promise.resolve({ value: Promise.reject(), done: false }) を返すときに、それを yield* すると例外として扱ってしまう問題の修正。承認された。
Always check regular expression flags by "flags" | Richard Gibson
RegExp のフラグを確認するときに直接 RegExp#global や RegExp#unicode を使うのではなく、RegExp#flags から該当するフラグが付与されているかをチェックするように変更する修正。承認された。
Allow toString of a built-in function to output a computed property name | Richard Gibson
ビルトイン函数に対して Function#toString を実行したときに computed property name を表示する修正。
Stage として進めていくこととなった。
https://github.com/tc39/proposal-stricter-function-tostring
Clarify the layering relationship between ECMA-262 and ECMA-402 | Richard Gibson
仕様の中に ECMA-262 と ECMA-402 の関係を明記する修正。承認された。
Stage 4 (ES2023)
Hashbang for stage 4 (PR) | Jordan Harband
CLI 環境のためにファイルの先頭に #! がある場合に JavaScript のランタイムとしてはコメントアウトとして扱う提案。Stage 4 になった 🎉
Stage 3
Resizable buffer's TypedArray.prototype.transfer detach check fix | Shu-yu Guo
{Resizable, Growable}ArrayBuffer を追加する提案。
TypedArray#transfer の中で IsDetachedBuffer を使ってチェックするタイミングを修正。
Change Array by Copy update issue 95 | Ashley Claymore
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} のように範囲を扱う函数の引数において、引数の順番チェックを行っていたバリデーションを取り除いた。
Temporal update and normative PRs (slides) | Philip Chimento
Date や Time を扱う新しいインターフェースを提供する提案。
今回も多くの修正が行われた。IETF による会議が 7/25 に行われ、少しずつ進んでいるとのこと。
NumberFormat v3 Stage 3 update Slides | Shane F Carr (Google)
Intl.NumberFormat に formatRange を追加したりや useGrouping オプションを拡張したりする提案。
ところどころ修正が入ったとのこと。
Duplicate named capturing groups for stage 3 | Kevin Gibbons
RegExp の named capturing の重複を許可する提案。Stage 3 になった。
これが入ると以下のような正規表現が書けるようになる。
code: js
/(?<year>0-9{4})-0-9{2}|0-9{2}-(?<year>0-9{4})/
Stage 2
Set methods: how to access properties of the argument (slides) | Kevin Gibbons
Set に新たに集合演算のメソッドを追加する提案。
引数にやってきた SetLike なオブジェクトをどうやって判定するかが議論になっている。例えば引数のオブジェクトの "has" メソッドをそのまま使ってしまったとすると、Map でも実行できてしまうことになってしまう。@@setHas のような Well-Known Symbol を用意して、"has" メソッドのエイリアスとする方法などが提案されている。
Iterator Helpers update (slides) | Michael Ficarra and Kevin Gibbons
新たに Iterator クラスを導入し、遅延リストとして扱うメソッドを追加する提案。
大きな変更点として、今まで Iterator Helpers のメソッドの返すインスタンスは "return", "throw" メソッドを元のソースイテレーターに転送するために保持していたが、これを廃止することになった。
Iterator Helpers について詳しくは 👉 遅延リストを扱うライブラリと Stage 2 Iterator Helpers - Zenn
Record & Tuple Update (slides) (issues) | Ashley Claymore, Rick Button, Robin Ricard
新たに Immutable Data Structure を扱うプリミティブとして Record と Tuple を追加する提案。
WebIDL においてオブジェクト、配列を受け取る部分についてそれぞれ Record と Tuple を受け取れるようにする作業が行われており、WHATWG の方では Structured Clone 周りでの作業が行われている。
9月の TC39 meeting で Stage 3 を目指すとのこと。
Record & Tuple について詳しくは 👉 イミュータブルにデータを扱うライブラリと Stage 2 Record & Tuple - Zenn
Import Reflection (slides) for stage 2 | Guy Bedford & Luca Casonato
新たに import module x from "<specifier>"; という構文を導入する提案。
WebAssembly には実行可能な WebAssembly.Instance と、依存などが解決していない WebAssembly.Module (Transferable) が存在しており、後者を明示的に取得することがモチベーションとなっている。Stage 2 になった。
Stage 1
Double-ended Iterator and Destructuring update (slides) | HE Shi-Jun
後ろから値を取れるイテレーターを作れるようにする提案。
今のところ新たに "nextLast" メソッドを追加することを想定しているっぽい。
Compartments as Module Loaders (Slides) | Kris Kowal
ShadowRealm よりも強力に、モジュールに import hook を与えたり、locale などを操作した環境で実行することができる Compartment クラスの提案。
今まではすべて Compartment クラスに押し込んでいたが、機能を分割して Module, ModuleSource そして Evaluators クラスに分けるようにしたとのこと。
Symbol Predicates for stage 1 or 2 (spec) (slides) | Jordan Harband & Robin Ricard
Symbol の static メソッドとして新たに Symbol.is{Registered, WellKnown} を導入する提案。
Symbols as WeakMap keys の提案において、GC によって消されることのない Symbol は WeakMap のキーとして扱えないという方針になったため、それを識別するメソッドが必要となった。Stage 1 になった。
Policy Maps & Sets for Stage 1 (slides) | J. S. Choi & Hemanth HM
新たに最大容量の決まった Map, Set を導入し、cache eviction できるようにする提案。
{LIFO, LRU, FIFO, LFU}{Set, Map} を追加する提案となっている。Stage 1 になった。
code: js
const cache = new LIFOMap(256);
const fnMemo = expensiveFn.memo(cache);
console.log( fnMemo(0) );
// Only the first fnMemo(0) calls expensiveFn; the second fnMemo(0) looks up
// the result of the first call in the cache.
Function memoization for Stage 1 (slides) | J. S. Choi & Hemanth HM
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} for Stage 1/2 (slides TDB) | Hemanth HM
Object.{pick, omit} を導入する提案。Stage 1 になった。
Stage 0
Function.pipe & flow for Stage 1 (slides) | J. S. Choi
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();
その他
Stenography support (slides, issue) | Daniel Ehrenberg
会議に速記のプロを雇う話。
Intl FallbackSymbol: well-known or not? | Jordan Harband
Well-formatted PDF standards for 2022 and beyond (slides new PDFs: ECMA-262 ECMA-402) | Allen Wirfs-Brock
総括
今回は既存の提案の変更点が共有されたり、また多くの新しい提案が Stage 1 に追加されたりするのが見受けられた。
Temporal は Stage 3 のはずだが前回同様かなり多くの変更点が入っていて、仕様が安定するのがいつになるのか気になる。
#ECMAScript