【ECMAScript】TC39プロポーザルを読んでみよう

ES2020ももうすぐ出ますね。
ECMAScriptは進みがとても早いので、新しい文法の候補を予め知っておくのも悪くないことです。
今、TC39のプロポーザルに上がっているものにどんなものがあるか読んでみましょう。
コア向けの機能に対するものも多いので、普段使いしそうなものを独断と偏見で選んで紹介します。
また、この記事の情報は2020年6月10日現在のものです。

どこでよめますか

以下から追えます。issueやプルリクエストで議論がされている様子も見られます。
GitHub – tc39/proposals: Tracking ECMAScript Proposals

用語

TC39

TC39 – ECMAScript

ECMAScriptの仕様を定める委員会のことです。Technical Committee 39 の略。
数字がついているからには他にもあって、たとえばTC52はDart、TC49はC#など。
以下から一覧できます。
Ecma Technical Committees and Task Groups

ECMA は European Computer Manufacturers Association の略です。

Proposal

直訳で「提案」です。新機能の提案のことですね。

Stage

TC39に挙げられるプロポーザルは5段階に分けられます。
Stage4まで行ったものが次のESMAScriptに含められます。
今年(ES2020)ですと optional chaining とか Promise.allSettled とかですね。

超ざっくり説明すると以下の様な形。詳しく正確に知りたい場合は The TC39 Process を読んでください。

Stage超ざっくり説明
0 / Strawperson提案されたもの。アイデア。
1 / ProposalStage 0 + 解決したい課題やその方法の説明(使用例とか API の形式とか)
2 / DraftStage 1 + 初期の仕様テキスト
3 / CandidateStage 2 + 完全な仕様テキスト、そのレビュー
4 / FinishedStage 3 + 2 つ以上の実装(V8 とか SpiderMonkey とか)

Stage 3

トップレベル await

GitHub – tc39/proposal-top-level-await: top-level await proposal for ECMAScript (stage 3)

おなじみの await がトップレベルで使えるようになります。
puppeteerやチャットボットなどの即時実行関数式で囲っていた起動コードがスッキリするようになります。

// いままで
(async () => await somePromise())();

// これから
await somePromise();

Promise.any

GitHub – tc39/proposal-promise-any: ECMAScript proposal: Promise.any

Promise.all や Promise.allSettled のように Promise を要素に持つ Iterable なオブジェクトを引数にとり、最初にresolveされた結果を resolve します。引数に渡したすべての Promise が reject された場合、rejectします。

これで複数の Promise を同時にハンドルする系のメソッドが出揃うことになります。普段使う分にはallSettledがあればだいたい十分な気はしますが……

メソッドfulfilled 条件reject 条件備考
Promise.allすべて fulfilledいずれかが reject
Promise.allSettledすべて fulfilled または rejectすべて rejectES2020 で追加
Primise.raceいずれかが fulfilledいずれかが reject
Promise.anyいずれかが fulfilledすべて rejectNEW!

数値区切り文字

GitHub – tc39/proposal-numeric-separator: A proposal to add numeric literal separators in Javascript. https://tc39.github.io/proposal-numeric-separator/

_ で数値を区切って見やすくできます。
Ruby とかではおなじみですね。

Stage 2

デコレーター

GitHub – tc39/proposal-decorators: Decorators for ES6 classes

関数に @hogehogeの形で修飾句を付与することで機能を追加できる機能です。
Javaとかではおなじみですが、TypeScript由来っぽいですね。

Map.prototype.upsert

GitHub – tc39/proposal-upsert: ECMAScript Proposal, specs, and reference implementation for Map.prototype.upsert

名前の通り、Mapに対してupsertをかけられます。

Stage 1

パイプライン演算子

GitHub – tc39/proposal-pipeline-operator: A proposal for adding the simple-but-useful pipeline operator to JavaScript.

シェルスクリプトの pipe のように、関数の返却値を次の関数の引数に渡します。
個人的には激推しの機能なのですが、文法が気持ち悪いという意見もあります。
|はビット演算子のOR(やTypeScriptのunion型)で埋まってるので仕方ないんです……

const hoge = aaaaa(bbbbb(ccccc(ddddd("fuga"))));
const hoge = "fuga" |> aaaaa |> bbbbb |> ccccc |> ddddd;

decimal

GitHub – tc39/proposal-decimal: Built-in decimal datatype in JavaScript

JS の数値は浮動小数点型なので、小数の四則演算で誤差が出る場合があります。

> 0.1 + 0.2
0.30000000000000004

金額とか扱うときは困るので、ちゃんとした 10 進数型を、ということですね。

まとめ

プロポーザルは誰でも出せるので、採用されるものもされないものもあります。
今後のECMAScriptがどういう方向に進んでいくのか予め知っておけば、その進化にしっかり順応していけると思います。
ECMAScriptへ正式採用される要件に「JavaScriptエンジンへの実装」があるので、Stage 3にあるものはV8など主要なエンジンには入っているものもあるので、試してみるのもアリかもです(トップレベルawaitはV8には入っていますね)。
備えよう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

14 − 10 =