ひとくち ECMA Stage3
最新の情報(※2020/05/08現在)知ってみたいけど細かい情報は読みたくない人向け
自分自身も理解半分
Legacy RegExp features in JavaScript
古いページとの Web 互換性を維持するために再登場させよう(提案)
新規に実装する際はちゃんと別の使おうね
Private instance methods and accessors
プライベートな getter/setter
メソッドにget #x()とかset #x(value)みたいな感じで使う
下のプライベートフィールドと繋がっているので説明省略
Class Public Instance Fields & Private Instance Fields
プライベートフィールドとして「#」がやってきた
クラスのフィールドで#hoge = 0;とすると、クラス外部からはアクセスできなくなる
今までは、_を prefix として付けて、「開発者以外は使うなよ(威圧)」とする手法が一般的だったがアクセスしようと思えば出来た
何でprivateキーワードじゃなくて#つけるんだよとお怒りな方はFAQを参照
動的なのが悪い
Static class fields and private static methods
上 2 つの提案に基づいたやつも含まれたこの 3 つが提案内容
staticキーワードを用いる
- 静的パブリックフィールド
- 静的プライベートメソッド
- 静的プライベートフィールド
ブラウザだと一番上の提案はもう使えたりするのであまり新規感ないけど(下二つはまだダメ)
Hashbang Grammar
Linux の shell 等から実行するために Shebangs / Hashbang に対応させる
Linux 民じゃないから何言ってるか分からないって?
# !/usr/bin/env node
// ↑これ
console.log("Hello world");
一番最初の行に書かれてるときだけ単一行コメント(//)のように動作する
あと複数行ダメ、最初の一行だけ
Numeric separators
その名の通り数値セパレータ
const a = 10000000000000;をconst b = 10_000_000_000_000;でも表記できるようにする
要するに数値を見やすくするための提案
ちなみにparseInt()やNumber()ではこの表記未対応なので注意(互換性のため)
一度 stage3→stage2 に落ちて、TypeScript メンバーがちゃぶ台を投げたりすることもあったが、今度はちゃんと stage4(Finished)に辿り着けるのか
Top-level await
トップレベル限定でasyncなしでもawaitが使えるように
あとトップレベルでawaitが使えるようになったお陰で、非同期処理の結果をexportできるようにもなった
いちいち関数で囲わなくてもいいんやなって
WeakRefs
JavaScript に弱参照がやってくる(WeakRef)
Q.そもそも参照が無いとどうなる? A.要らないのでガベージコレクションで消す
Q.弱参照って? A.参照はあるけど、参照先のデータが無いかもしれない状態のこと
Q.じゃあこれどうやって使うの? A.重いデータのキャッシュ等として
あとガベージコレクトされたタイミングで呼ばれるFinalizationGroupも一緒に提案されてます
RegExp Match Indices
正規表現でキャプチャされた部分文字列の開始インデックスと終了インデックスに関する追加情報を提供
/a+(?<Z>z)?/.exec("xaaaz")とかでこの追加情報が取れるように
Example 見ても最初の例以外いまいちピンと来なかった
String.prototype.replaceAll
今まで文字を置換する際、該当する文字全部を置き換えるには正規表現で"hogehoge".replace(/h/g, "")とするしか無かった
これが"hogehoge".replaceAll("h", "")で良くなる
むしろ何で今まで無かったんだろ
Promise.any
PromiseにはPromise.all()、Promise.race()、Promise.allSettled()の 3 つがあったが、新たな仲間が加わる
| メソッド | 説明 |
|---|---|
| Promise.all() | 全ての Promise が Resolve したら Resolve する |
| Promise.race() | 最初の一つが Resolve したら Resolve する(ただし Reject されたら即 Reject する) |
| Promise.allSettled() | とにかく全て実行(基本的に Reject はしない) |
| Promise.any() | 最初の一つが Resolve したら Resolve する(ただし Reject されても続行) |
こんな感じで微妙に挙動が違う
Atomics.waitAsync
ブロックすることが許可されていないエージェントで使用するための「非同期Atomic待機」の提案
JavaScriptをWeb Workersを用いてマルチスレッドで動かしてるような人とかじゃないと縁のない話
もちろん私もそうである
Logical Assignment Operators
演算子||=と&&=と??=の提案
ここ最近?.と??がnode v14.0.0に実装されたことは記憶に新しいが、また新たな演算子がやってきた
??=に関してはPHPやC#に既に実装されており、||=と&&=はRubyに既に実装されている
console.log([0, 1, 2].map(v => v &&= 5));
// [0, 5, 5]
console.log([0, 1, 2].map(v => v ||= 5));
// [5, 1, 2]
こんな感じで使うのだろうか…?