なぜ誰かがLodashまたはUnderscore.jsユーティリティライブラリのどちらかを他よりも好むのでしょうか?
Lodashはアンダースコアのドロップイン代替品のようで、後者はもっと長く存在していました。
どちらも素晴らしいと思いますが、知識に基づいた比較を行うためにそれらがどのように機能するかについては十分にわかりません。違いについてもっと知りたいと思います。
なぜ誰かがLodashまたはUnderscore.jsユーティリティライブラリのどちらかを他よりも好むのでしょうか?
Lodashはアンダースコアのドロップイン代替品のようで、後者はもっと長く存在していました。
どちらも素晴らしいと思いますが、知識に基づいた比較を行うためにそれらがどのように機能するかについては十分にわかりません。違いについてもっと知りたいと思います。
Lodashを作成して、配列、文字列、オブジェクト、およびargumentsオブジェクト1に対してより一貫性のある環境間の反復サポートを提供しました。それ以来、Underscore.jsのスーパーセットになり、より一貫性のあるAPI動作、より多くの機能(AMDサポート、ディープクローン、ディープマージなど)、より徹底的なドキュメントと単体テスト(Node.js、RingoJS、Rhinoで実行されるテスト)を提供します。 、Narwhal、PhantomJS 、およびブラウザー)、大規模な配列/オブジェクトの反復のための全体的なパフォーマンスと最適化の向上、およびカスタムビルドとテンプレートの事前コンパイルユーティリティによる柔軟性の向上。
LodashはUnderscore.jsよりも頻繁に更新されるため、最新の安定バージョンのUnderscore.jsとの互換性を確保するためのlodash underscoreビルドが提供されます。
ある時点で、私はUnderscore.jsへのプッシュアクセスさえも与えられました。これは、Lodashが30を超える問題を提起する責任があるためです。Underscore.js v1.4.x +でのランディングのバグ修正、新機能、パフォーマンスの向上。
さらに、デフォルトでLodashを含むBackbone.jsボイラープレートが少なくとも3つあり、LodashはBackbone.jsの公式ドキュメントに記載されています。
LodashとUnderscore.jsの違いの詳細については、キットケンブリッジの投稿「Lo-Dashに「こんにちは」と言ってください」をご覧ください。
脚注:
argumentsオブジェクトのサポートに一貫性がありません。新しいブラウザでは、Underscore.jsメソッドは配列の穴を無視し、「Objects」メソッドargumentsはオブジェクトを反復処理し、文字列は配列のように扱われ、メソッドは関数(「prototype」プロパティを無視)とオブジェクト(「toString」などのシャドウプロパティを反復処理)を正しく反復します。 "と"valueOf")、古いブラウザではそうではありません。また、のようなUnderscore.jsメソッド_.cloneは配列の穴を保持しますが、他のメソッドは保持_.flattenしません。LodashはUnderscore.jsに触発されていますが、最近では優れたソリューションです。カスタムビルドを作成し、パフォーマンスを高め、AMDをサポートし、優れた追加機能を利用できます。jsperfでこのLodashとUnderscore.jsのベンチマークを確認してください...Lodashに関するこの素晴らしい投稿:
コレクションを操作するときに最も便利な機能の1つは、簡略構文です:(
アンダースコアもこの構文をサポートするようになりました)
var characters = [
{ 'name': 'barney', 'age': 36, 'blocked': false },
{ 'name': 'fred', 'age': 40, 'blocked': true }
];
// Using "_.filter" callback shorthand
_.filter(characters, { 'age': 36 });
// Using Underscore.js
_.filter(characters, function(character) { return character.age === 36; } );
// → [{ 'name': 'barney', 'age': 36, 'blocked': false }]
(Lodashのドキュメントから取得)
私のように、Underscore.jsとLodashの使用法の違いのリストを期待していた場合は、Underscore.jsからLodashに移行するためのガイドがあります。
後世のための現在の状態は次のとおりです。
- アンダースコア
_.anyはLodashです_.some- アンダースコア
_.allはLodashです_.every- アンダースコア
_.composeはLodashです_.flowRight- アンダースコア
_.containsはLodashです_.includes- アンダースコア
_.eachは、戻ることによって終了することを許可しませんfalse- アンダースコア
_.findWhereはLodashです_.find_.flattenLodashが浅いのに対し、アンダースコアはデフォルトで深いです- アンダースコア
_.groupByは、パラメーターが渡されるiterateeをサポートしますが(value, index, originalArray)、Lodashでは、のiteratee_.groupByは単一のパラメーターのみが渡されます(value)。_.indexOf3番目のパラメーターを持つUnderscore.jsundefinedはLodashです_.indexOf_.indexOf3番目のパラメーターを持つUnderscore.jstrueはLodashです_.sortedIndexOf- アンダースコア
_.indexByはLodashです_.keyBy- アンダースコア
_.invokeはLodashです_.invokeMap- アンダースコア
_.mapObjectはLodashです_.mapValues- アンダースコア
_.maxはLodash_.maxと_.maxBy- アンダースコア
_.minはLodash_.minと_.minBy- アンダースコア
_.sampleはLodash_.sampleと_.sampleSize- アンダースコア
_.objectはLodash_.fromPairsと_.zipObject- 述語によるアンダースコア
_.omitはLodashです_.omitBy- アンダースコア
_.pairsはLodashです_.toPairs- 述語によるアンダースコア
_.pickはLodashです_.pickBy- アンダースコア
_.pluckはLodashです_.map- アンダースコア
_.sortedIndexはLodash_.sortedIndexと_.sortedIndexOf- アンダースコア
_.uniqはiterateeLodashです_.uniqBy- アンダースコア
_.whereはLodashです_.filter- アンダースコア
_.isFiniteは一致しませんNumber.isFinite
(たとえば、Underscore.jsで_.isFinite('1')返されますが、Lodashでは返されます)truefalse- アンダースコア
_.matchesの省略形は、詳細な比較をサポートしていません
(例_.filter(objects, { 'a': { 'b': 'c' } }):)- アンダースコア≥1.7&Lodash
_.template構文は_.template(string, option)(data)- Lodash
_.memoizeキャッシュはMapオブジェクトのようなものですcontextLodashは、多くのメソッドの引数をサポートしていません。_.bind- Lodashは、暗黙的な連鎖、遅延連鎖、およびショートカット融合をサポートします
- Lodashは、オーバーロードされた、、、
_.head&を、、、、_.last&_.restに分割します (つまり、Underscore.jsではLodashにあります)_.initial
_.take_.takeRight_.drop_.dropRight_.head(array, 2)_.take(array, 2)
ジョンの答えに加えて、Lodash(これまでUnderscore.jsにとって「私も」と見なしていた)を読み、パフォーマンステストを見て、ソースコードとブログ投稿を読んで、いくつかのポイントがありますLodashをUnderscore.jsよりもはるかに優れたものにする次のとおりです。
Underscore.jsのソースコードを調べると、最初の数行で、Underscore.jsが多くの関数のネイティブ実装にフォールバックしていることがわかります。理想的な世界では、これはより良いアプローチでしたが、これらのスライドに示されているパフォーマンスリンクのいくつかを見ると、これらの「ネイティブ実装」の品質がブラウザによって大きく異なるという結論を引き出すのは難しくありません。 to-ブラウザ。Firefoxはいくつかの機能で非常に高速であり、一部のChromeでは支配的です。(Internet Explorerも支配するシナリオがいくつかあると思います)。ブラウザ間でパフォーマンスがより一貫しているコードを選択する方が良いと思います。
以前にブログ投稿を読んでください、そしてそれのためにそれを信じる代わりに、ベンチマークを実行することによってあなた自身で判断してください。Chromeのような単純なネイティブ関数でも、LodashのパフォーマンスがUnderscore.jsよりも100〜150%速いのを見て、私は今驚いています。
Array.every
Lodashの違いのリストは次のとおりです。Underscore.jsビルドは、Underscore.jsプロジェクトのドロップイン代替品です。
2014年でも、私の主張は正しいと思います。
私見、この議論はかなり不釣り合いになりました。前述のブログ投稿を引用する:
Underscore、Valentine、wuなどのほとんどのJavaScriptユーティリティライブラリは、「ネイティブファーストのデュアルアプローチ」に依存しています。このアプローチはネイティブ実装を優先し、ネイティブの同等のものがサポートされていない場合にのみバニラJavaScriptにフォールバックします。しかし、jsPerfは興味深い傾向を明らかにしました。配列または配列のようなコレクションを反復処理する最も効率的な方法は、ネイティブ実装を完全に回避し、代わりに単純なループを選択することです。
「単純なループ」と「バニラJavascript」は、配列またはオブジェクトメソッドの実装よりもネイティブであるかのように。うわあ...
信頼できる唯一の情報源があれば確かにいいのですが、そうではありません。あなたが他のことを言われたとしても、私の愛するバニラ神は存在しません。ごめんなさい。本当に当てはまる唯一の仮定は、すべての主要なブラウザーで同じことの異なる実装があることを知って、すべての主要なブラウザーでうまく機能することを目的としたJavaScriptコードを書いているということです。穏やかに言えば、それに対処するのは雌犬です。しかし、それはあなたがそれを好むかどうかにかかわらず、前提です。
たぶん、皆さんはTwitterのようなパフォーマンスを必要とする大規模なプロジェクトに取り組んでいるので、現在、1秒あたりのリストで850,000(Underscore.js)と2,500,000(Lodash)の反復の違いを実際に確認できます。
私はそうではありません。つまり、パフォーマンスの問題に対処しなければならないプロジェクトに取り組みましたが、Underscore.jsとLodashのどちらによっても解決されたり、引き起こされたりすることはありませんでした。そして、たとえば、反復可能(オブジェクトまたは配列、スパースかどうか!)のループの実装とパフォーマンス(現在C ++について話している)の実際の違いを把握しない限り、私は気になりませんすでに意見が述べられているベンチマークプラットフォームの結果に基づく主張を伴う。
たとえば、Rhinoを1回更新するだけで、単一の「中世のループメソッドのパフォーマンスが永遠に向上し、何でもない」という単純な事実について議論できるような方法で、配列メソッドの実装に火をつけることができます。 Firefoxの突然の配列メソッドはすべて、彼/彼女が考えているbrainfuckよりもはるかに高速です。男、あなたはあなたのランタイム環境をだますことによってあなたのランタイム環境をだますことはできません!宣伝するときはそれについて考えてください...
あなたのユーティリティベルト
... 次の時間。
したがって、関連性を保つために:
ニーズに最も適したアプローチを選択してください。いつものように。私はいつでも意見のあるランタイムチートよりも実際の実装へのフォールバックを好みますが、それでも最近は好みの問題のようです。http://developer.mozilla.comやhttp://caniuse.comなどの高品質のリソースに固執すれば、問題はありません。
ここで述べられていることのほとんどに同意しますが、Underscore.jsを支持する議論を指摘したいと思います。それはライブラリのサイズです。
特に、主にモバイルデバイスで使用することを目的としたアプリやウェブサイトを開発している場合は、結果のバンドルのサイズと、起動時間またはダウンロード時間への影響が重要な役割を果たす可能性があります。
比較のために、これらのサイズは、Ionicserveを実行した後にsource-map-explorerで気付いたサイズです。
Lodash: 523 kB
Underscore.js: 51.6 kB
BundlePhobiaを使用して、 LodashとUnderscore.jsの現在のサイズを確認できます。
それがOPの意味であるかどうかはわかりませんが、Underscore.jsからLodashに移行するときに留意しなければならない問題のリストを探していたため、この質問に出くわしました。
誰かがそのような違いの完全なリストを含む記事を投稿してくれたら本当にありがたいです。私が苦労して学んだこと(つまり、私のコードを本番環境で爆発させたもの)から始めましょう:/):
_.flattenUnderscore.jsのデフォルトは深いので、浅くするには2番目の引数としてtrueを渡す必要があります。Lodashでは、デフォルトでは浅く、2番目の引数としてtrueを渡すと、深くなります。:)_.lastUnderscore.jsでは、必要な要素の数を示す2番目の引数を受け入れます。Lodashにはそのようなオプションはありません。これをエミュレートできます.slice_.first(同じ問題)_.templateUnderscore.jsはさまざまな方法で使用できますが、その1つは、テンプレート文字列とデータを提供し、HTMLを元に戻すことです(または、少なくとも以前はそのように機能していました)。Lodashでは、データをフィードする必要がある関数を受け取ります。_(something).map(foo)Underscore.jsで動作しますが、Lodashではに書き直さなければなりませんでした_.map(something,foo)。おそらくそれは単なるTypeScript問題でした。BenMcCormickによるUnderscorevsLo-Dashは、2つを比較した最新の記事です。
- LodashのAPIは、Underscore.jsのスーパーセットです。
- 内部的には、Lodashは完全に書き直されています。
- Lodashは間違いなくUnderscore.jsより遅くはありません。
- Lodashは何を追加しましたか?
- 操作性の向上
- 追加機能
- パフォーマンスの向上
- 連鎖の省略構文
- 必要なものだけを使用するカスタムビルド
- セマンティックバージョニングと100%のコードカバレッジ
私にとって重要な違いが1つ見つかりました。Underscore.jsと互換性のないバージョンのLodashは、クラスレベルで定義されたプロパティまたはメソッドをコピーし_.extend()ません。
これを実証するJasmineテストをCoffeeScriptで作成しました。
https://gist.github.com/softcraft-development/1c3964402b099893bd61
幸い、lodash.underscore.jsUnderscore.jsのすべてをコピーする動作は保持されます。これは、私の状況では望ましい動作でした。
Lodashには_.mapValues()、Underscore.jsと同じものがあり_.mapObject()ます。
ほとんどの場合、Underscore.jsはLodashのサブセットです。
時々、現在のように、Underscore.jsには、mapObjectのように、Lodashにはないクールな小さな機能があります。これにより、プロジェクトの開発にかかる時間を大幅に節約できました。
それらは非常に似ており、Lodashが引き継いでいます...
どちらもJavaScriptのユーティリティの世界を取り入れたユーティリティライブラリです...
Lodashは現在、より定期的に更新されているようです。そのため、最新のプロジェクトでより多く使用されています...
また、 Lodashは2、3KBだけ軽いようです...
どちらも優れたAPIとドキュメントを備えていますが、 Lodashの方が優れていると思います...
これは、配列の最初の値を取得するための各ドキュメントアイテムのスクリーンショットです...
Underscore.js:
Lodash:
時々更新されるかもしれないので、彼らのウェブサイトもチェックしてください...