ES2023その2 / ES2023 / ES2022 / ES2021
先日ES2023では新機能が2個しかなかったという話をしましたが、どういうわけか2023/01/30になってからES2023が2個追加されました。
よくわかりませんが、どうやら1月までは前年のESになるみたいです。
なんで。
これらは2023/01/30に行われたTC39ミーティングで決定したようです。
他にIntl.NumberFormat V3もStage4への議題に上がったみたいですが、こちらは却下されたみたいです。
なんでそんなふわふわな言及なのかってまだアジェンダしかないから詳しいことがわからねえんだよ。
Finished Proposals
Change Array by copy
配列を破壊せずに操作するメソッドを追加します。
既存の配列操作メソッドは、変更後の値を返すと同時に元の値も変更してしまいます。
const a = [2, 3, 1];
const b = a;
b[1] = 4;
console.table(b); // [2, 4, 1]
console.table(a); // [2, 4, 1] ← ?
const c = a.sort();
console.table(c); // [1, 2, 4]
console.table(a); // [1, 2, 4] ← ??
const d = a.reverse();
console.table(d); // [4, 2, 1]
console.table(a); // [4, 2, 1] ← ????
これはひどい。
おかげで毎回Array.concat()やらArray.slice()やらの不正な使用を強制させられるという有様でした。
今回のProposalが通ったことで、ようやくまともに配列操作関数が扱えるようになります。
const a = [2, 3, 1];
const b = a.with(1, 4);
console.table(b); // [2, 4, 1]
console.table(a); // [2, 3, 1]
const c = a.toSorted();
console.table(c); // [1, 2, 3]
console.table(a); // [2, 3, 1]
const d = a.toReversed();
console.table(d); // [1, 3, 2]
console.table(a); // [2, 3, 1]
なお、ChromeではDev Trial 108でようやく使えるようになっただけで通常版リリースはいまだ未定、Firefoxも実装はされたもののリリース優先度はさして高くない、とかいう段階なので、一般的に書けるようになるのはまだまだ先です。
というか、そんな状態なのにFinished Proposalに入れるのか?
Symbols as WeakMap keys
WeakMapのキーにSymbolを使えますよ、というProposal。
const weakmap = new WeakMap();
const key = Symbol("key");
weakmap.set(key, 1); // OKになる
const key = "key";
weakmap.set(key, 1); // Uncaught TypeError: Invalid value used as weak map key
そもそもインスタンス使い捨てのJavaScriptで弱参照を使う理由がいまだによくわからない。
きっとライブラリとかツールチェーンとかで使われるのでしょう。たぶん。
ちなみに他の人が上げていた懸念点2点のうち、Symbol.for()で作ったSymbolの登録は禁止されました。
well-knownなシンボルは許可されます。
weakmap.set(Symbol.iterator, 1); // OK
weakmap.set(Symbol.for("key"), 1); // Uncaught TypeError: Invalid value used as weak map key
こちらは2022/11/29リリースのChrome 108から利用可能です。
CanIUseには何故か出てこない。
感想
リリースされてもいないのにFinishedになったりとか、リンク先のRFCがStage 3のままさっぱり更新されていなかったりとか、なんというかこう政治的事情を感じたりしないでもないというかなんか。
具体的にどういう経緯があったのかはわかりません。
ミーティングはクローズドでありライブ配信やアーカイブもないみたいで、さらに議事録が公開されるまで数ヶ月かかるので、それまでは何があったかわからないんですよね。
と思ったけどよく考えたら私リスニングが駄目なのでライブ配信があったところでわからんかったわ。
まあきっと、もっと詳しい誰かがそのうち詳細な経緯とかも含めて解説してくれることでしょう。