いいえ、絶対に使ってはいけないわけではありません。しかし、ほとんどの場合はUnderscore自体が不要か、または、より優れたライブラリがある事を知っておくべきです。
Underscoreを使う理由のほとんどが失われた
かつてのJavaScriptはそれほど有用な関数が用意されていませんでした。また、関数が用意されていたとしても、ブラウザに実装の差があるため、どのブラウザでも動くように作成する場合は、そう簡単に使える物ではありませんでした。
リスト、配列、ベクトル、ストリーム、コレクションなどといわれるシーケンスの処理を考えてみてください。逐次処理(each)、写像(map)、畳み込み(foldl/foldr, reduce, inject)、選択(filter, select)などは重要な処理であり、特に関数型プログラミングでは必須とも言える物です。しかし、JavaScriptの初期の実装ではそれらの関数は用意されておらず、for
文を用いて手続き的にする必要がありました。
さすがにこれは不便と言うことで作られたのがUnderscoreというライブラリです。また、jQueryでも同じような実装をしているものもあります。JavaScriptに足りない機能を補い、ブラウザ間の差異を気にすることも無くなりました。
しかし、これは昔の話です。現在のJavaScriptではそのような有用な関数は仕様に追加されており、また、現在もサポートされている現代的なブラウザではそれらが使用できるようになっています1。今や組み込みの関数をそのまま使用できるのが現状であり、使用しても問題はありません。Underscoreを使う理由のほとんどは失われています。
Underscoreの代わりに
それでもUnderscoreを使うというのであれば、その前に、より優れたライブラリの存在を知るべきでしょう。
それでも必要な関数があるのであれば、Lodashを使え
有用な関数は仕様に追加されてJavaScriptに取り込まれたと言ってもUnderscoreの全ての関数がそうなったというわけではありません。依然としてJavaScriptにはネイティブに存在しない関数も存在します。だからといってUnderscoreを使うというのが正しいとは言えません。Underscoreよりも優れたライブラリであるLodashがあるからです。
LodashはUnderscoreを参考に作られたと言われています。Underscoreに用意されていた関数を同じように踏襲し、さらに追加しています。また、Lodashはモジュールベースで作成されており、必要な機能だけを取り込むことも可能です。ベンチマーク的にもLodashの方が優れている場合が多いようで、開発も盛んで、人気も上がっています。もはや、Underscoreを使う必要性はありません。
速度を求めるなら、Lazy.jsで遅延処理
もし、速度に不満があるのであれば、Lazy.jsを使うという方法があります。まだ詳しくは調べていないのですが、mapやfilterなど逐一Arrayを作ると言うことはせずに、最後に一気に処理を進めるという遅延処理を行うようです。RubyのEnumerator::Lazyに近い動作だと思われます。(あとで調べて追記予定)
関数型プログラミングをやるなら、Ramdaがお勧め
あなたが関数型プログラミングをこよなく愛し、関数型プログラミングで書きたいと思っているのであれば、JavaScriptは不満だらけの言語でしょう。JavaScriptを関数型言語だという勘違いした人がいますが、関数が第一級オブジェクトであること以外になんら関数型言語らしい所はありません。
UnderscoreやLodashはそんな関数型プログラミングを助けてはくれますが、完全ではありません。各関数の発想はどうしても命令型プログラミングから来ているからです。そこでお勧めするのがRamdaです。RamdaはUnderscoreにあるような関数が同じように用意されていますが、その設計は関数型プログラミングにあわせています。全ての関数がカリー化されていることはもちろんのこと、部分適用も可能ですし、関数合成もできます。また、引数の順番もHaskellなどであるような順番(map
で関数が第一引数になるなど)を採用しています。identity
という何もせずにそのままそれを返す関数(恒等関数と言われる)まで用意されています。
JavaScriptで関数型プログラミングをしたいんだが、LiveScriptやPureScriptを使うのはちょっとと思っているのであれば、Ramdaは非常にお勧めです。
まとめ
まとめますと次のような選択になるでしょう。
要望 | ライブラリ |
---|---|
よくある処理をしたい | 組込関数(ネイティブ) |
組み込みにない関数を使いたい | Lodash |
遅延処理で高速化したい | Lazy.js |
関数型プログラミングを取り入れたい | Ramda |
この表にUnderscoreが入り込む余地はありません。
-
どのブラウザで使用できるかはECMAScript 5 compatibility tableを参考にしてください。 ↩