なぜ、lodash.js と underscore.js のどちらかのユーティリティライブラリを好むのでしょうか?
Lodashはunderscoreの代替品と思われますが、underscoreの方がより長い歴史があります。
どちらも素晴らしいものだと思いますが、私は比較できるほど仕組みについて知らないので、その違いについてもっと知りたいです。
私は、配列、文字列、オブジェクト、および arguments
オブジェクトに対して、より一貫した環境横断的な反復処理のサポートを提供するために Lo-Dash を作成しました1 。その後、Underscoreのスーパーセットとして、より一貫したAPIの動作、より多くの機能(AMDサポート、ディープクローン、ディープマージなど)、より徹底したドキュメントとユニットテスト(Node、Ringo、Rhino、Narwhal、PhantomJS、ブラウザで実行するテスト)、大きな配列やオブジェクト反復に対するより良い全体性能と最適化、さらに、カスタムビルドやテンプレートプリコンパイルのユーティリティなどより柔軟に対応するようになった。
Lo-DashはUnderscoreよりも頻繁に更新されるため、Underscoreの最新の安定版との互換性を確保するために、lodash underscore
ビルドが提供されています。
一時期はUnderscoreのプッシュアクセス6を与えられたこともありましたが、それはLo-Dashが30以上の問題提起、バグフィックス、新機能、amp、Underscore v1.4.x+のperf gainを担当したことによります。
さらに、Lo-Dashをデフォルトで含むBackboneボイラープレートが少なくとも3つあり、Backboneの公式ドキュメントでもLo-Dashが言及されるようになりました。
Lo-DashとUnderscoreの違いについては、Kit Cambridgeの記事「Say "Hello" to Lo-Dash」1で詳しく解説しています。
脚注です:
1.Underscoreは、配列、文字列、オブジェクト、および arguments
オブジェクトのサポートに一貫性がありません。新しいブラウザでは、Underscoreのメソッドは配列の穴を無視し、 "Objects" メソッドは arguments
オブジェクトを繰り返し、文字列は配列として扱い、メソッドは関数(その "prototype" 属性を無視)とオブジェクト( "toString" や "valueOf" など影のある特性を繰り返し処理)を正しく反復しますが、古いブラウザでは反復されません。また、_.clone
のようなUnderscoreのメソッドは配列の穴を保持しますが、_.flatten
のような他のメソッドは保持しません。
Lo-Dashはアンダースコアにインスパイアされたものですが、現在ではより優れたソリューションとなっています。カスタムビルド]1が可能で、高いパフォーマンス、AMDをサポートし、素晴らしい追加機能を備えています。jsperfのLo-Dash vs Underscore benchmarksや、Lo-Dashに関する素晴らしい記事をご覧ください:
コレクションを扱う際に最も便利な機能の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
_.filter(characters, function(character) { return character.age === 36; } );
// → [{ 'name': 'barney', 'age': 36, 'blocked': false }]
(lodash docs から抜粋)
私のように、アンダースコアとロダッシュの間の使用法の違いのリストを期待していた場合、アンダースコアからロダッシュに移行するためのガイドがあります。
後世のための現在の状態は次のとおりです。
アンダースコア
_.any
はLodash_.some
です。 アンダースコア_.all
はLodash_.every
です。 アンダースコア_.compose
はLodash_.flowRight
です。 アンダースコア_.contains
はLodash_.includes
です。 アンダースコア_.each
は、false
を返すことで終了できません。 アンダースコア_.findWhere
はLodash_.find
です。
- Underscore
_.flatten
はデフォルトでディープですが、Lodashは浅いです。- Underscore
_.groupBy
は、パラメータ(値、インデックス、originalArray)
を渡される反復をサポートします。 Lodashでは、「。groupBy」の反復は単一のパラメーター「(value)」のみを渡されます。 *アンダースコア `.indexOf、3番目のパラメーター
undefinedはLodash
.indexOfです。 *アンダースコア
.indexOf、3番目のパラメーター
trueはLodash
.sortedIndexOfです。 *アンダースコア
.indexByはLodash
_.keyBy`です。- Underscore
_.invoke
はLodash_.invokeMap
です。- Underscore
_.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
。iteratee
によるアンダースコア_.uniq
はLodash_.uniqBy
です。 アンダースコア_.where
はLodash_.filter
です。 アンダースコア_.isFinite
はNumber.isFinite
と一致しません。 (例:._.isFinite( '1')
はUnderscoreではtrue
を返しますが、Lodashではfalse
を返します)。 アンダースコア_.matches
ショートハンドは深い比較をサポートしていません
。 (例:._.filter(オブジェクト、{'a':{'b': 'c'}})
)。 アンダースコア≥1.7& Lodash_.template
構文is
_.template(string、option)(data)
。- Lodash
_.memoize
キャッシュはオブジェクトのようにMap
です。- Lodashは、「_。bind」を支持する多くの方法の「コンテキスト」引数をサポートしていません。
- Lodashは暗黙の連鎖、怠惰な連鎖、&ショートカットフュージョン。
- Lodashは、オーバーロードされた
_.head
、_.last
、_.rest
、&_.initial
out into
。_.take
、_.takeRight
、_.drop
、&_.dropRight
。 (すなわち. Underscoreの_.head(array、2)
は、Lodashの_.take(array、2)
です。
John'さんの回答に加え、lodash(これまでunderscoreのme-quot;me-too"と考えていた)を読み、パフォーマンステストやソースコード、ブログ記事(http://kitcambridge.be/blog/say-hello-to-lo-dash/)を見て、lodashがunderscoreよりはるかに優れているいくつかの点は、以下のとおりです:
1.それは速度の問題ではなく、速度の_consistency_の問題です(?) underscoreのソースコードを見ると、最初の数行でunderscoreが多くの関数のネイティブ実装にフォールバックしていることがわかります。理想的な世界では、これがより良いアプローチだったのですが、このスライドにあるいくつかのperfリンクを見てみると、これらの 'native implementations' の品質はブラウザによって大きく異なるという結論を導き出すのは難しいことではありません。Firefoxは一部の機能で非常に高速ですが、一部の機能ではChromeが圧倒的に優れています。(IEが優位に立つシナリオもあると思います)。私は、ブラウザ間で性能がより一貫しているコードを好む方が良いと考えています。
先ほどのブログ記事を読んで、それを鵜呑みにするのではなく、ベンチマークを実行して、自分で判断してください。Chromeの
Array.every
のようなシンプルでネイティブな関数でさえ、lodashがunderscoreより100-150%高速であるのを見て、私は今、唖然としているところです!
2.lodashのextrasもかなり便利です。 3.Xananaxがunderscoreのコードに貢献することを提案し、非常に高く評価されたコメントについてです:イノベーションを継続させるだけでなく、自分自身(あるいは自分のライブラリ)を良い状態に保つための原動力にもなります。
lodashとの相違点リストです。underscore-buildはunderscoreプロジェクトのドロップイン置き換えです。
これは2014年で、数年では遅すぎます。 それでも私のポイントは成り立つと思います。
私見この議論はかなり不均衡に吹き飛ばされました。 前述のブログ投稿を引用します。
Underscore、ValentineなどのほとんどのJavaScriptユーティリティライブラリ。 wu、「ネイティブファーストのデュアルアプローチに依存してください。”このアプローチが優先されます。 ネイティブの実装。バニラJavaScriptにフォールバックする場合のみ。 ネイティブの同等物はサポートされていません。 しかし、jsPerfは興味深いことを明らかにしました。 トレンド:配列または配列のようなものを反復する最も効率的な方法。 収集は、ネイティブの実装を完全に回避することです。 代わりに単純なループ。
「シンプルループ」と「バニラJavascript」は、配列やオブジェクトメソッドの実装よりもネイティブです。 ええ。 ...
真実の単一の情報源があることは確かに良いことですが、ありません。 あなたが別のことを言われたとしても、私の愛するバニラの神はいない。 申し訳ありません。 本当に当てはまる唯一の仮定は、すべての主要なブラウザでパフォーマンスを向上させることを目的としたJavascriptコードを書いているということです。 控えめに言っても、対処するのは雌犬です。 しかし、それが好きかどうかにかかわらず、それが前提です。
たぶん、y'allはTwitterのパフォーマンスを必要とする大規模なプロジェクトに取り組んでおり、850,000(アンダースコア)と. 1秒あたりのリストを超える2,500,000(ロダッシュ)反復。!
私はそうではありません。 つまり、パフォーマンスの問題に対処しなければならないプロジェクトに取り組みましたが、それらはUnderscoreでもLo-Dashでも解決または引き起こされたことはありません。 そして、実装とパフォーマンスの実際の違い(今はC ++について話しています)を理解しない限り、反復可能(オブジェクトまたは配列、スパースかどうか)上のループを言いましょう。!)、[すでに意見がある]ベンチマークプラットフォームの結果に基づく主張に ⁇ わされることはありません(https://github.com/bestiejs/benchmark.js/blob/master/package.json) 。
RhinoがArrayメソッドの実装を1つの"ではない方法で火に設定するには、1つの更新のみが必要です。;中世のループメソッドは、より優れた、そして永遠に、そして何を&クォートします。; 司祭は、FFの突然の配列方法のすべてが彼/彼女の意見のあるブレインファックよりもはるかに速いという単純な事実について彼/彼女の方法を主張することができます。 ランタイム環境をだましてランタイム環境をだますことはできません。! 宣伝するときにそれについて考えてください。 ...
ユーティリティベルト。
次回。.. したがって、関連性を維持するために:
ネイティブishを犠牲にすることなく、便利な場合はUnderscoreを使用します。 便利な機能があり、拡張機能カタログ(ディープコピーなど)が気に入った場合は、Lo-Dashを使用してください。)そして、もしあなたがインスタントパフォーマンスを切望していて、そして最も重要なこととして、ネイティブAPIのアウトシャインの独断的なワークアウウンドが終わったらすぐに代替案に落ち着いても構わない。 それはすぐに起こります。 限目。
ニーズに最も合うアプローチを選択してください。 いつものように。 私はいつでも、意見のあるランタイムチートよりも実際の実装のフォールバックを好みますが、それでも、今日の好みの問題のようです。 http://developer.mozilla.comやhttp://caniuse.comなどの高品質のリソースに固執すれば、大丈夫です。
ここで述べたことのほとんどに同意しますが、underscore.jsを支持する議論を指摘したいだけです。ライブラリのサイズです。
特に、主にモバイルデバイスで使用するアプリまたはWebサイトを開発している場合、結果のバンドルのサイズと、起動またはダウンロード時間への影響が重要な役割を果たす可能性があります。
比較のために、これらのサイズは、イオンサーブを実行した後にソースマップエクスプローラーで気づいたものです。
lodash: 523kB
underscore.js: 51.6kb
それがOPの意味であるかどうかはわかりませんが、アンダースコアからロダッシュに移行するときに心に留めておかなければならない問題のリストを探していたので、この質問に遭遇しました。
誰かがそのような違いの完全なリストを含む記事を投稿していただければ幸いです。 私が難しい方法で学んだこと(つまり、コードが本番環境で爆発させたもの:/)から始めましょう:
アンダースコアの _.flatten
はデフォルトでディープであり、浅くするには2番目の引数としてtrueを渡す必要があります。 lodashではデフォルトで浅く、2番目の引数が深くなるため、trueを渡します。! :)。
アンダースコアの「_.last」は、必要な要素の数を示す2番目の引数を受け入れます。 「ロダッシュ」にはそのようなオプションはありません。 これを「.slice」でエミュレートできます。
_.first
(同じ問題)。
*アンダースコアの「_.template」は多くの方法で使用できます。そのうちの1つは、テンプレート文字列とデータを提供し、「HTML」を取り戻すことです(少なくとも、これはしばらく前の動作です)。 lodash
には、データとともにフィードする関数を受け取ります。_(something).map(foo)
はアンダースコアで機能しますが、ロダッシュでは _.map(something、foo)
に書き直す必要がありました。 おそらくそれは単なる「TypeScript」の問題でした。http://benmccormick.org/2014/11/12/underscore-vs-lodash/。
ベン・マコーミックによる2つを比較する最新の記事:
1。 Lo-DashのAPIはUnderscoreのスーパーセットです。
2。 フードの下で[Lo-Dash]は完全に書き直されました。
3。 Lo-Dashは間違いなくUnderscoreよりも遅くありません。
4。 Lo-Dashが追加されたもの?
-ユーザビリティの改善。 -余分な機能。 -パフォーマンスが向上します。 -チェーンの省略形構文。 -必要なもののみを使用するカスタムビルド。 -セマンティックバージョンと100%コードカバレッジ。
結局、私にとって重要な違いが1つ見つかりました。 lodashの _.extend()
の非アンダースコア互換バージョンは、クラスレベルで定義されたプロパティまたはメソッドをコピーしません。
これを示すCoffeeScriptでジャスミンテストを作成しました。
https://gist.github.com/softcraft-development/1c3964402b099893bd61。
幸いなことに、「lodash.underscore.js」はUnderscoreのすべてをコピーする動作を維持します。これは、私の状況では望ましい動作でした。
それらはかなり似ており、 Lodash が引き継いでいます。..
どちらもJavaScriptのユーティリティの世界を取り入れたユーティリティライブラリです。..
Lodash は定期的に更新されるようになったため、最新のプロジェクトでより多く使用されています。..
また、 Lodash は、2、3 KB軽量化されているようです。..
どちらも類人 ⁇ とドキュメントが優れていますが、 Lodash の方が良いと思います。..
以下は、配列の最初の値を取得するための各ドキュメントのスクリーンショットです。..
アンダースコア:。
。。
lodash:。 。。
物事は時々更新されるかもしれないので、ちょうど彼らのウェブサイトもチェックしてください。..