-
【ECMAScript】TC39プロポーザルを読んでみよう
- 2020年6月11日
- JavaScript
ES2020ももうすぐ出ますね。
ECMAScriptは進みがとても早いので、新しい文法の候補を予め知っておくのも悪くないことです。
今、TC39のプロポーザルに上がっているものにどんなものがあるか読んでみましょう。
コア向けの機能に対するものも多いので、普段使いしそうなものを独断と偏見で選んで紹介します。
また、この記事の情報は2020年6月10日現在のものです。
どこでよめますか
以下から追えます。issueやプルリクエストで議論がされている様子も見られます。
GitHub – tc39/proposals: Tracking ECMAScript Proposals
用語
TC39
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 / Proposal | Stage 0 + 解決したい課題やその方法の説明(使用例とか API の形式とか) |
2 / Draft | Stage 1 + 初期の仕様テキスト |
3 / Candidate | Stage 2 + 完全な仕様テキスト、そのレビュー |
4 / Finished | Stage 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 | すべて reject | ES2020 で追加 |
Primise.race | いずれかが fulfilled | いずれかが reject | |
Promise.any | いずれかが fulfilled | すべて reject | NEW! |
数値区切り文字
_
で数値を区切って見やすくできます。
Ruby とかではおなじみですね。
Stage 2
デコレーター
GitHub – tc39/proposal-decorators: Decorators for ES6 classes
関数に @hogehoge
の形で修飾句を付与することで機能を追加できる機能です。
Javaとかではおなじみですが、TypeScript由来っぽいですね。
Map.prototype.upsert
名前の通り、Mapに対してupsertをかけられます。
Stage 1
パイプライン演算子
シェルスクリプトの 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には入っていますね)。
備えよう。
この記事を書いた人 : 池上龍一
AWS bluebird css CSV docker docker compose electron ES6 es2015 Git Heroku ITコンサルティング JavaScript justinmind less mongoDB Node.js php PostgreSQL Private Space Promise React react-router reactjs Salesforce scss Selenium Builder selenium IDE Selenium WebDriver stylus TypeScript VirtualBox VisualStudioCode vue vuejs webpack システム開発プロジェクト セキュリティ ワイヤーフレーム 上流工程 卒FIT 帳票 要件定義 設計 電力小売業界