なぜ誰かが lodash.js または underscore.js ユーティリティを好むのはなぜでしょう。他の上のライブラリ?
Lodashはアンダースコアの代わりになるものと思われますが、後者は長めのものでした。
私は両方とも素晴らしいと思いますが、私は彼らが教育を受けた比較をするためにどのように働くかについて十分に知りません、そして私は違いについてもっと知りたいです。
配列、文字列、オブジェクト、およびarguments
オブジェクトに対して、より一貫したクロス環境の反復サポートを提供するためにLo-Dashを作成しました。1。 Underscoreのスーパーセットとなり、より一貫したAPIの振る舞い、より多くの 機能 (AMDのサポート、ディープクローン、ディープマージなど)、より徹底的な ドキュメンテーション 、そして単体テスト(テスト)を提供します。これは、Node、Ringo、Rhino、Narwhal、PhantomJS、およびブラウザで実行され、大規模な配列/オブジェクトの反復処理に対して全体的なパフォーマンスと最適化が向上し、 カスタムビルド およびテンプレート事前コンパイルユーティリティによる柔軟性が向上します。
Lo-DashはUnderscoreよりも頻繁に更新されるため、lodash underscore
build が提供されています は、最新の安定版のUnderscoreとの互換性を保証します。
ある時点で、私はUnderscoreに プッシュアクセス さえ与えられました。これは、Lo-Dashが30以上の問題を提起する責任があるためです。 Underscore v1.4.x以降での、バグ修正、新機能の追加、およびパフォーマンスの向上。
さらに、デフォルトでLo-Dashを含む最低3つのBackboneボイラープレートがあり、Lo-DashはBackboneの公式の documentation に記載されています。
Kit Cambridgeの投稿、 をご覧ください。Lo-DashとUnderscoreの違いの詳細については、「こんにちは」とLo-Dash を参照してください。
脚注:
arguments
オブジェクトのサポートに一貫性がありません。新しいブラウザでは、Underscoreメソッドは 配列の穴 を無視し、 "Objects"メソッドはarguments
オブジェクトを反復し、文字列は配列のように扱われ、メソッドは関数を正しく反復します( "prototype"プロパティは無視)およびオブジェクト(反復) "toString"や "valueOf"のような影付きのプロパティ)、古いブラウザではそうではありません。また、_.clone
のようなアンダースコアのメソッドは配列の穴を保存しますが、_.flatten
のようなアンダースコアのメソッドは保存しません。Lo-Dashはアンダースコアに触発されていますが、今日では優れたソリューションです。あなたはあなたの カスタムビルド を作ることができ、 より高いパフォーマンス を持ち、AMDをサポートしますそして すばらしい追加機能 を持っています。 jsperfでこの Lo-DashとUnderscoreベンチマーク を比較してください。.これ 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 から取得)
私と同じように、アンダースコアとlodashの使用法の違いのリストを期待していたのなら、アンダースコアからlodashに移行するための ガイドがあります .
これが子孫のための現状です。
- アンダースコア
_.any
はLodash_.some
です- アンダースコア
_.all
はLodash_.every
です- アンダースコア
_.compose
はLodash_.flowRight
です- アンダースコア
_.contains
はLodash_.includes
です- アンダースコア
_.each
は、false
を返して終了することを許可しません- アンダースコア
_.findWhere
はLodash_.find
です- アンダースコアの
_.flatten
はデフォルトで深く、Lodashは浅いです- アンダースコア
_.groupBy
は、パラメータ(value, index, originalArray)
が渡される反復対象をサポートしますが、Lodashでは、_.groupBy
の反復対象は単一のパラメータ(value)
のみが渡されます。- 3番目のパラメータ
undefined
を持つアンダースコア_.indexOf
はLodash_.indexOf
です- 3番目のパラメータ
true
を持つアンダースコア_.indexOf
は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
を結合iteratee
によるアンダースコア_.uniq
はLodash_.uniqBy
です- アンダースコア
_.where
はLodash_.filter
です- アンダースコア
_.isFinite
はNumber.isFinite
と一致しません
(例:_.isFinite('1')
は、アンダースコアではtrue
を返しますが、Lodashではfalse
を返します)- アンダースコアの
_.matches
の速記は、深い比較をサポートしていません
(例:_.filter(objects, { 'a': { 'b': 'c' } })
)- アンダースコア≧1.7&Lodash
_.template
の構文は_.template(string, option)(data)
- Lodashの
_.memoize
キャッシュはMap
のようなオブジェクトです- Lodashは
_.bind
を支持して多くのメソッドに対してcontext
引数をサポートしていません- Lodashは 暗黙の連鎖 、 怠惰な連鎖、&ショートカットの融合 をサポートしています。
- Lodashは、オーバーロードした
_.head
、_.last
、_.rest
、および_.initial
をに分割しました_.take
、_.takeRight
、_.drop
、&_.dropRight
(つまり、アンダースコアの_.head(array, 2)
はLodashの_.take(array, 2)
です)
Johnの答え、そしてlodash(これまで私はアンダースコアの「私も」と見なしていました)を読んで、パフォーマンステストを見て、ソースコードを読んで、そして ブログの投稿 、lodashがアンダースコアよりもはるかに優れている点は次のとおりです。
それはスピードのことではありません、それは 一貫性 スピードのことです(?)
アンダースコアのソースコードを調べると、最初の数行にアンダースコアが多くの関数のネイティブ実装に頼っていることがわかります。理想的な世界では、これはより良いアプローチでしたが、 これらのスライド に記載されているperfリンクを見れば、それほど難しくありません。これらの「ネイティブ実装」の品質はブラウザごとに大きく異なるという結論を導きます。 Firefoxは、いくつかの機能において非常に高速であり、いくつかのChromeにおいて優勢です。 (私はIEが支配するシナリオもいくつかあると思います)。私は、パフォーマンスがブラウザ間でより一貫しているコードを好む方が良いと思います。
ブログの投稿を先に読んでください。そのためにそれを信じる代わりに、 ベンチマーク を実行して判断してください。 Chromeの
Array.every
のような simple 、 native 関数でも、アンダースコアよりも100〜150%高速なlodashの実行が見られます。
Lodashのextrasも非常に便利です。
これは、lodash間の 相違点 のリストです。アンダースコアビルドは、アンダースコアプロジェクトの代わりとなるドロップインです。
これは2014年で、数年遅れています。それでも私の主張は成り立つと思います:
私見この議論はかなりの割合で吹き飛ばされました。前述の ブログ記事を引用する :
Underscore、Valentine、wuなどのほとんどのJavaScriptユーティリティライブラリは「ネイティブ優先デュアルアプローチ」に依存しています。このアプローチではネイティブ実装が優先され、ネイティブ同等物がサポートされていない場合のみVanilla JavaScriptに戻ります。しかし、jsPerfは興味深い傾向を明らかにしました。配列または配列に似たコレクションを反復処理する最も効率的な方法は、ネイティブ実装を完全に回避し、代わりに単純なループを選択することです。
まるで "単純なループ"と "バニラジャバスクリプト"が、配列やオブジェクトメソッドの実装よりネイティブであるかのようです。そうねえ...
確かに一つの真実の源があるのはいいことですが、そうではありません。あなたが他に言われたとしても、私の愛するバニラ神はいない。ごめんなさい。本当に成り立つ唯一の仮定は、私たち全員がすべての主要なブラウザでうまく機能することを目的としたJavascriptコードを書いているということです。それは穏やかに言えば対処するのは雌犬です。あなたがそれを好むかどうかにかかわらず、それは前提です。
たぶんy'allがTwitterのパフォーマンスを必要とする大規模なプロジェクトに取り組んでいるので、実際には1秒あたりのリストで850,000(アンダースコア)と2,500,000(lodash)の繰り返しの違い がわかります たった今!
私は1つではありません。つまり、パフォーマンスの問題に対処しなければならないプロジェクトで仕事をしていましたが、それらがUnderscoreでもLo-Dashでも解決されなかったか、引き起こされたことはありません。そして、私が実装とパフォーマンスの本当の違い(私たちが今C++について話している)がイテラブル(オブジェクトまたは配列、まばらかどうかにかかわらず)のループを言うのを手に入れない限り、私はむしろ邪魔をしないベンチマークプラットフォームの結果に基づいて すでに意見が述べられている と主張している。
1つの更新だけでRhinoにそのArrayメソッドの実装を起動させることができます。これは、「中世のループメソッドを1つだけ実行しても成功しない」という単純な事実を回避する方法ではありません。 FFの突然の配列メソッドは、彼/彼女の説得力のあるブレインファックよりはるかに速いです。あなたのランタイム環境をだますことによってあなたのランタイム環境をだますことはできません!昇進するときそれについて考えなさい….
あなたの実用的なベルト
... 次回。
関連性を保つために:
自分のニーズに最も合ったアプローチを選択してください。いつものように。私はいつでも意見のあるランタイムの詐欺より実際の実装でのフォールバックを好みますが、それでも最近では好みの問題のようです。 http://developer.mozilla.com および http://caniuse.com のような質の高いリソースにこだわります。ただ大丈夫です。
私はここで述べたことの大部分に同意しますが、私はただunderscore.jsを支持する議論を指摘したいと思います:ライブラリのサイズです。
特にモバイル機器で使用することを目的としたアプリやWebサイトを開発している場合は、作成されるバンドルのサイズと起動時間またはダウンロード時間への影響が重要な役割を果たす可能性があります。
比較のために、これらのサイズはionive serveを実行した後にsource-map-Explorerで気づいたものです。
lodash: 523kB
underscore.js: 51.6kb
それがOPの意味であるかどうかは定かではありませんが、アンダースコアからlodashに移行するときに留意しなければならない問題のリストを探していたため、この質問に出会いました。
誰かがそのような違いの完全なリストを載せた記事を投稿してくれたら本当にありがたいです。私が苦労して学んだこと(つまり、私のコードが実運用環境で爆発的に発展したもの:/)から始めましょう。
_.flatten
はデフォルトでは深く、それを浅くするためには2番目の引数としてtrueを渡さなければなりません。 lodashでは、デフォルトでは浅く、2番目の引数としてtrueを渡すと深くなります。 :)_.last
は、必要な要素数を示す2番目の引数を受け入れます。 lodash
にはそのようなオプションはありません。これを.slice
でエミュレートすることができます_.first
(同じ号)_.template
はさまざまな方法で使用できます。そのうちの1つは、テンプレート文字列とデータを提供してHTML
を取得することです(または少なくともそれが以前に機能した方法です)。 lodash
では関数を受け取り、それにデータを入れます。_(something).map(foo)
はアンダースコアで動作しますが、lodashでは_.map(something,foo)
に書き直す必要がありました。おそらくそれはただのTypeScript
- issueでしたhttp://benmccormick.org/2014/11/12/underscore-vs-lodash/
Ben McCormickによる両者を比較した最新の記事:
Lo-DashのAPIは、アンダースコアのAPIのスーパーセットです。
フードの下に[Lo-Dash]は完全に書き直されました。
ローダッシュは確かにアンダースコアより遅くはありません。
Lo-Dashは何を追加しましたか?
- ユーザビリティの向上
- 追加機能
- パフォーマンス向上
- 連鎖のための速記構文
- あなたが必要とするものだけを使うカスタムビルド
- セマンティックバージョニングと100%コードカバレッジ
1つの違いが私にとって重要であることがわかりました。 lodashの_.extend()
の非アンダースコア互換バージョンは、notクラスレベルで定義されたプロパティまたはメソッドをコピーします。
これを実証するCoffeeScriptでJasmineテストを作成しました。
https://Gist.github.com/softcraft-development/1c3964402b099893bd61
幸いなことに、lodash.underscore.js
はすべてをコピーするというUnderscoreの振る舞いを保持しています。
lodashは_.mapValues()
を持っていますが、これはunderescoreの_.mapObject()
と同じです。
ほとんどの場合、アンダースコアはlodashのサブセットです。時々、現在アンダースコアのように、lodashがmapObjectのように持っていないクールな小さな関数を持つでしょう。これは私のプロジェクトの開発において多くの時間を節約しました。
それらはかなり似ており、Lodashが引き継いでいます...
どちらもJavaScriptのユーティリティの世界を取り込んだユーティリティライブラリです...
どうやらLodashは現在定期的に更新されているため、最新のプロジェクトでより多く使用されています...
また、Lodashは数KBほど軽いようです...
両方とも良いAPIとドキュメントを持っていますが、Lodashの方が良いと思います...
以下は、配列の最初の値を取得するための各ドキュメントのスクリーンショットです...
アンダースコア:
状況は時々更新される可能性があるため、ウェブサイトも確認してください...