ひとくち ECMA Stage3

# ひとくち ECMA Stage3

最新の情報(※2020/05/08現在)知ってみたいけど細かい情報は読みたくない人向け

~~自分自身も理解半分~~

## Legacy RegExp features in JavaScript

古いページとの Web 互換性を維持するために再登場させよう(提案)

新規に実装する際はちゃんと別の使おうね

https://github.com/tc39/proposal-regexp-legacy-features

## Private instance methods and accessors

プライベートな getter/setter

メソッドに`get #x()`とか`set #x(value)`みたいな感じで使う

下のプライベートフィールドと繋がっているので説明省略

https://github.com/tc39/proposal-private-methods

## Class Public Instance Fields & Private Instance Fields

プライベートフィールドとして「#」がやってきた

クラスのフィールドで`#hoge = 0;`とすると、クラス外部からはアクセスできなくなる

今までは、`_`を prefix として付けて、「開発者以外は使うなよ(威圧)」とする手法が一般的だったがアクセスしようと思えば出来た

何で`private`キーワードじゃなくて`#`つけるんだよとお怒りな方は[FAQ](https://github.com/tc39/proposal-class-fields/blob/master/PRIVATE_SYNTAX_FAQ.md0)を参照

~~動的なのが悪い~~

https://github.com/tc39/proposal-class-fields

## Static class fields and private static methods

上 2 つの提案に基づいたやつも含まれたこの 3 つが提案内容

`static`キーワードを用いる

- 静的パブリックフィールド
- 静的プライベートメソッド
- 静的プライベートフィールド

ブラウザだと一番上の提案はもう使えたりするのであまり新規感ないけど(下二つはまだダメ)

https://github.com/tc39/proposal-static-class-features/

## Hashbang Grammar

Linux の shell 等から実行するために Shebangs / Hashbang に対応させる

Linux 民じゃないから何言ってるか分からないって？

```JS
#!/usr/bin/env node
// ↑これ
console.log("Hello world");
```

一番最初の行に書かれてるときだけ単一行コメント(`//`)のように動作する

あと複数行ダメ、最初の一行だけ

https://github.com/tc39/proposal-hashbang

## Numeric separators

その名の通り数値セパレータ

`const a = 10000000000000;`を`const b = 10_000_000_000_000;`でも表記できるようにする

要するに数値を見やすくするための提案

ちなみに`parseInt()`や`Number()`ではこの表記未対応なので注意(互換性のため)

一度 stage3→stage2 に落ちて、[TypeScript メンバーがちゃぶ台を投げたりする](https://github.com/Microsoft/TypeScript/issues/24836)こともあったが、今度はちゃんと stage4(Finished)に辿り着けるのか

https://github.com/tc39/proposal-numeric-separator

## Top-level await

トップレベル限定で`async`なしでも`await`が使えるように

あとトップレベルで`await`が使えるようになったお陰で、非同期処理の結果を`export`できるようにもなった

いちいち関数で囲わなくてもいいんやなって

https://github.com/tc39/proposal-top-level-await

## WeakRefs

JavaScript に弱参照がやってくる(`WeakRef`)

Q.そもそも参照が無いとどうなる？ A.要らないのでガベージコレクションで消す

Q.弱参照って？ A.参照はあるけど、参照先のデータが無いかもしれない状態のこと

Q.じゃあこれどうやって使うの？ A.重いデータのキャッシュ等として

あとガベージコレクトされたタイミングで呼ばれる`FinalizationGroup`も一緒に提案されてます

https://github.com/tc39/proposal-weakrefs

## RegExp Match Indices

正規表現でキャプチャされた部分文字列の開始インデックスと終了インデックスに関する追加情報を提供

`/a+(?<Z>z)?/.exec("xaaaz")`とかでこの追加情報が取れるように

~~Example 見ても最初の例以外いまいちピンと来なかった~~

https://github.com/tc39/proposal-regexp-match-Indices

## String.prototype.replaceAll

今まで文字を置換する際、該当する文字全部を置き換えるには正規表現で`"hogehoge".replace(/h/g, "")`とするしか無かった

これが`"hogehoge".replaceAll("h", "")`で良くなる

~~むしろ何で今まで無かったんだろ~~

https://github.com/tc39/proposal-string-replaceall

## 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 されても続行)**       |

こんな感じで微妙に挙動が違う

https://github.com/tc39/proposal-promise-any

## Atomics.waitAsync

ブロックすることが許可されていないエージェントで使用するための「非同期Atomic待機」の提案

JavaScriptをWeb Workersを用いてマルチスレッドで動かしてるような人とかじゃないと縁のない話

~~もちろん私もそうである~~

https://github.com/tc39/proposal-atomics-wait-async

## Logical Assignment Operators

演算子```||=```と```&&=```と```??=```の提案

ここ最近```?.```と```??```がnode v14.0.0に実装されたことは記憶に新しいが、また新たな演算子がやってきた

```??=```に関してはPHPやC#に既に実装されており、```||=```と```&&=```はRubyに既に実装されている

```JS
console.log([0, 1, 2].map(v => v &&= 5));
// [0, 5, 5]

console.log([0, 1, 2].map(v => v ||= 5));
// [5, 1, 2]
```

こんな感じで使うのだろうか…？

https://github.com/tc39/proposal-logical-assignment