2018-09 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
Array を継承したクラスで Array#{concat, filter, map, slice, splice} をオーバライドしたものが呼ばれたときにちゃんとそのクラスのインスタンスを返すようにする変更。
パフォーマンスと Web の互換性のためにリジェクトされた。
Async Functions で await したときに無駄に tick をかけてしまっていたのを修正。
ECMAScript の Spec において
integer index: +0 ~ 253-1 の範囲の integer 文字列
array index: +0 ~ 232-1 の範囲の integer 文字列
という定義になっている。
OrdinaryOwnPropertyKey が最初に integer index を列挙した後に、それ以外の文字列を追加された順に列挙し、最後に Symbol を列挙することになっているが、実際の実装では array index を列挙して(以下略)となっている。仕様を実装に合わせようっていう話。
今まで Iterator の next はメソッドでなくても特に TypeError を投げてなかったが、メソッド以外のものが入ってたときにちゃんと TypeError を投げるようにする的な話。
互換性の問題がないか確認された後に入れる事になった。
Dynamic Modules の提案のために仕様を少し書き換える提案。
実装を待って Allen 氏の判断を仰ぐみたいな感じらしい。
Stage 3
前提として String#{split, match, replace, search} といった RegExp を受け取る系のメソッドには RegExp 側の挙動を定義するために RegExp#[@@split] のような Well-Known Symbols を key としたメソッドを使うような仕様になっている(RegExp を継承したときにそれらをオーバライドして使う)。
String#split の仕様が IsRegExp を使わずに単に引数の @@split プロパティがメソッドなら……みたいな場合分けをしているので、今回の String#matchAll も一貫性をもたせて IsRegExp を使わない仕様にするという話。
ES2018 の仕様を見た感じだと IsRegExp を使っているのは String#{includes, startsWith, endsWith} のみになるっぽい。
highcharts.js で Break The Web !!!!
Highcharts.js line labels disappear with Array#flat enabled
Private Symbols の話が出たので、どっちがいいんだろう的な話がされたっぽい。
JSON は最近 UTF-8 でやり取りしないといけないことが明記されたが、UTF-16 のサロゲートコードポイントが U+D800 ~ U+DFFF の UTF-8 に変換するのに不正な文字列でもそのまま入れられてしまっていた。その際にちゃんとエスケープシーケンスでいい感じにする提案。
Stage 3 になった。
Stage 2
前回同様 private state に対する Decorators をどうするかや export の前後問題が決着していなそう。
絵文字周り Unicode Sequence として RegExp に入れるやつ。Stage 2 になった。
code: (js)
const regexEmojiKeycap = /\p{Emoji_Keycap_Sequence}/u;
regexEmojiKeycap.test('4️⃣'); // '4\uFE0F\u20E3'
// → true
Node.js の bin とかでファイルの先頭に #! にしたときを仕様でちゃんとコメント扱いにする提案。Stage 2 になった。
Date を一新するやつ。Stage 2 になった。
Stage 1
Date.parse を標準化する提案。Stage 1 になった。
Promise.all は一つでも rejected されたらそこで終わるが、Promise.allSettled は fulfilled, rejected 関係なくすべての Promise が終わったとき終わる。Stage 1 になった。
DOM API の仕様の記述に使われている WebIDL みたいなものを ECMAScript にも取り入れようという提案。Stage 1 になった。
WebIDL に寄せるか、過去に同じ試みをしたときの JSIDL に寄せるかはやっていく中で決めていくらしい。
JSON で Number.MAX_SAFE_INTEGER を超える整数値が来たときにちゃんと BigInt にできるようにするやつ。
BigInt を JavaScript に入れるにあたって JSON に BigInt のリテラルを入れる提案があったが、もはや JSON は JavaScript だけで扱われるものではなく影響範囲が広いため却下された。
そもそも JSON をパースするにあたって JSON の number の値を int64 として扱うか double として扱うかはクライアント側で持つ必要があり、JSON はそこを担保していなかった。
ところで ECMAScript の JSON.parse の第二引数に函数を渡すと JSON の value 部分を変更できるが、JSON の number は ECMAScript の number に丸められてしまうため BigInt にすることが出来なかった。
code: (js)
JSON.parse('{"bigint": 12345678901234567890}', (key, value) => {
console.log(value); // 12345678901234567000
return value;
});
これだとネイティブの JSON.parse が使えなくて、自前でパース処理を実装しなければならずとても不便ということで函数の第三引数に source text を入れるようにするという提案。
code: (js)
JSON.parse('{"bigint": 12345678901234567890}', (key, value, src) => {
console.log(value); // 12345678901234567000
console.log(src); // "12345678901234567890"
return BigInt(src);
});
Stage 1 になった。
for-in の順番は実装依存で ECMAScript で特に指定されていなかったが、ES2015 の Reflect.ownKeys で非 index key な文字列の key は追加された順を返す仕様があるため、for-in の順番を仕様で規定しても困難ではないだろう……みたいな感じでこの際に順番を決めようという提案。Stage 1 になった。
その他
Array#sort stability
Chrome 70 の Array#sort が安定ソートになったのに伴って、すべてのモダンブラウザで安定になったので仕様に盛り込もうという提案。
どうやら Edge の ChakraCore はまだ安定ソードではなさそうなので、それの進捗待ちっぽい。
Consistent Behavior Delegation for Configurable Properties & Extensible Values
Include static in static method toString
ES2015 のときにも提案が遭った Private Symbols を再考する話。以前は Proxy との兼ね合いの問題がありリジェクトされたが、Proxy ではハンドリングされないと決めることで回避してそう。
そもそも Private Symbols は WeakMap と同等な機能を提供するのみなので、まあ無くても大丈夫といえば大丈夫そう……。
ECMA-402 Intl status update
Intl の更新まとめ。
総括
今回は Normative 案件が多く、また Array#sort の安定性の話や Private Symbols、IDL など過去の決定を再考する議論が多かった。
結構面白い議題が多かったように思えるが、Array#flat や Private State が Stage 4 に入らず Stage 1 がまた大量生産されているので大丈夫なのか心配。