Dataflow Proposalsのまとめ記事を読んだ
JavaScriptを大きく変えうる Dataflow Proposals の概要と論点(Call-this, Pipe Operator)
結構話題になっていたので読んだ。
いくつかのProposalをまとめてDataflow Proposalsというらしく、それについての説明。
自分はプロポーザルレベルでJavaScriptの仕様を追えておらず(なんなら知らない仕様もたくさんある)、どのプロポーザルが良い悪いというのはすぐに議論できるような知識/経験を持ち合わせていないので、直感的に思ったことや他の人のコメントなどを参考にさせてもらおうと思っている。
Pipe operator
|>
と@
という演算子(@
のほうは演算子という呼び方でいいのかすら分からない)が追加される。
|>
の左辺で評価された値が右辺の@
でキャッチされて、左辺で評価された値を右辺で使うことができる。
これを使うと関数型のようにメソッドチェーンが多くなったり関数内で呼び出す関数が複数あったりするときに、どの順番でどの関数が呼ばれ、どの結果の値がどこに使われるのかというのをわかりやすくしてくれる。
サンプルコードを読んでみたが、たしかにわかりやすいかもしれない。
ただ、今までの書き方でもわりと分かるなという気持ちもある。メソッドチェーンが連なりすぎたり、関数内のネストが増えてきたら適切に変数に切り出すのを意識していれば、まあなくても困らない気はする。
構文に使われる文字の議論も、他の演算子などとの被りや出現頻度、パースのしやすさなどで議論されてるのを知り、「なるほど……」となった。
Call-this operator
tree-shakingのしやすさと開発者体験の向上のため、Function.prototype.call
を~>
で書けるようにする。
関数のインポートでは問題ないが、クラスのインポートだとtree-shakingがやりにくい(クラスをインポートするとすべてのメソッドがバンドルされてしまうため)
Function.prototype.call
を用いるとクラスを使わずにthisを参照でき、その糖衣構文ということらしい。
ちょっと曖昧な理解のままだ。thisはとにかく使わないようにしているので、ちょっと頭の中で想像するには足りないところがあるかも。
Partial application (PFA)
関数の部分適用が可能になる構文を追加する。
const func2 = func1~('a', ?)
func2('b')
のように書ける。
Function.prototype.bind
やアロー関数を使えば書ける。bindは色々面倒で、アロー関数は実行するたびに評価させるので無駄なコストが発生しやすいらしい。
個人的にはアロー関数で書くことが完全に習慣化されているし、~
の目grepのしにくさがかなり渋い気持ちがある。アロー関数で良い気がするが……。
Extensions
拡張メソッドや拡張プロパティを定義できる。
const ::func = ...
のような書き方で、呼び出し時も::func
という呼び方をする。
通常の定数や関数とは別の名前空間を持つらしい。
サンプルコードを見てみると、レシーバー(Rubyの呼び方だとこうだけどJavaScriptだとどうなんだろう)をthisで持っている。
なんかごちゃごちゃしている感じがする……。
果たしてこれは開発者を幸せにするのか?
複雑性の面で否定的な意見も多いみたいで、protoypeを特別扱いする仕様もそうだけど、あんまり嬉しくなさそう。
Function.pipe and flow
関数適用と関数合成を行う組み込み関数が追加させる。
これはまあ、あったら便利だよねというのは分かるけども……。
これも多くなる場合は分解する気がするが、分解することで余分にメモリを使ったりするのを嫌ってという感じなんだろうか。今の自分には欲しいとは思わない。記事内にもあるようにPipe operatorとやってること自体はあまり変わらないし。
その他
相互運用性や名前空間の枯渇など、難しい問題があるというのを知れただけでもよかった。日頃使っている言語なのでもうちょっと仕様を追いかけて詳しくなりたいし、その一歩としてこの記事はとても分かりやすくまとめてくれていたありがたかった。