なぜ誰かがlodash.jsまたはunderscore.jsを好むのでしょうかユーティリティライブラリを他?
ロダッシュはアンダースコアのドロップイン代替品のようですが、アンダースコアはより長く使用されていました。
どちらもすばらしいと思いますが、それらがどのように機能するかについて十分に理解していないため、知識のある比較を行うことができません。違いについてもっと知りたいのですが。
なぜ誰かがlodash.jsまたはunderscore.jsを好むのでしょうかユーティリティライブラリを他?
ロダッシュはアンダースコアのドロップイン代替品のようですが、アンダースコアはより長く使用されていました。
どちらもすばらしいと思いますが、それらがどのように機能するかについて十分に理解していないため、知識のある比較を行うことができません。違いについてもっと知りたいのですが。
回答:
Lo-Dashを作成して、配列、文字列、オブジェクト、およびargumentsオブジェクト1に対して、より一貫したクロス環境反復のサポートを提供しました。以降、アンダースコアのスーパーセットになり、より一貫したAPI動作、より多くの機能(AMDサポート、ディープクローン、ディープマージなど)、より詳細なドキュメントとユニットテスト(Node、Ringo、Rhino、Narwhal、PhantomJSで実行されるテスト)を提供します、およびブラウザー)、大規模な配列/オブジェクトの反復処理のための全体的なパフォーマンスと最適化の向上、およびカスタムビルドによる柔軟性の向上とテンプレートの事前コンパイルユーティリティによる。
Lo-DashはUnderscoreよりも頻繁に更新されるため、Underscoreの最新の安定バージョンとの互換性を確保するためのlodash underscoreビルドが提供されます。
ある時点で、私はアンダースコアへのプッシュアクセスさえ与えられました。これは、一部にはLo-Dashが30以上の問題を提起する責任があるためです。着陸のバグ修正、新機能、およびUnderscore v1.4.x +のパフォーマンス向上。
さらに、デフォルトでLo-Dashを含む少なくとも3つのBackboneボイラープレートがあり、Lo-DashがBackboneの公式ドキュメントで言及されています。
Lo-DashとUnderscoreの違いの詳細については、キットケンブリッジの投稿「Say "Hello" to Lo-Dash」を参照してください。
脚注:
Lo-Dashはアンダースコアから着想を得ていますが、現在では優れたソリューションです。あなたは作ることができますカスタムビルド持って、より高い性能を、AMDをサポートしてい偉大な余分な機能を。このチェック下線ベンチマーク対LO-ダッシュを ...このjsperf上とLO-ダッシュについての素晴らしい記事を:
コレクションを操作するときに最も便利な機能の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はロダッシュです_.some- アンダースコア
_.allはロダッシュです_.every- アンダースコア
_.composeはロダッシュです_.flowRight- アンダースコア
_.containsはロダッシュです_.includes- アンダースコア
_.eachは戻ることによる終了を許可しませんfalse- アンダースコア
_.findWhereはロダッシュです_.find_.flattenロダッシュが浅い間、アンダースコアはデフォルトで深いです- アンダースコア
_.groupByは、パラメーターが渡される反復子をサポートしますが(value, index, originalArray)、Lodashでは、反復子に_.groupBy渡されるパラメーターは1つだけです(value)。- アンダースコア
_.indexOf3番目のパラメータではundefinedLodashです_.indexOf- アンダースコア
_.indexOf3番目のパラメータではtrueLodashです_.sortedIndexOf- アンダースコア
_.indexByはロダッシュです_.keyBy- アンダースコア
_.invokeはロダッシュです_.invokeMap- アンダースコア
_.mapObjectはロダッシュです_.mapValues- アンダースコア
_.maxはロダッシュ_.maxと_.maxBy- アンダースコア
_.minはロダッシュ_.minと_.minBy- アンダースコア
_.sampleはロダッシュ_.sampleと_.sampleSize- アンダースコア
_.objectはロダッシュ_.fromPairsと_.zipObject_.omit述語によるアンダースコアはロダッシュです_.omitBy- アンダースコア
_.pairsはロダッシュです_.toPairs_.pick述語によるアンダースコアはロダッシュです_.pickBy- アンダースコア
_.pluckはロダッシュです_.map- アンダースコア
_.sortedIndexはロダッシュ_.sortedIndexと_.sortedIndexOf- アンダースコア
_.uniqによってiterateeあるLodash_.uniqBy- アンダースコア
_.whereはロダッシュです_.filter- アンダースコア
_.isFiniteが一致しないNumber.isFinite
(例:アンダースコアで_.isFinite('1')戻りますtrueがfalse、Lodashでは戻ります)- アンダースコアの
_.matches省略表現は、深い比較をサポートしていません
(例_.filter(objects, { 'a': { 'b': 'c' } }))- アンダースコア≥1.7&Lodash
_.template構文は_.template(string, option)(data)- Lodash
_.memoizeキャッシュはMapオブジェクトのようなものです- Lodashは
context多くのメソッドの引数をサポートしていません_.bind- Lodashは暗黙の連鎖、遅延連鎖、およびショートカット融合をサポートします
- Lodashは、オーバーロードを分割し
_.head、_.last、_.rest、&_.initialに出て
_.take、_.takeRight、_.drop、&_.dropRight
(すなわち_.head(array, 2)アンダースコアではある_.take(array, 2)Lodashで)
Johnの回答に加えて、lodash(これまではアンダースコアの "私"と見なしていた)について読み、パフォーマンステストを確認し、ソースコードを読み、ブログの投稿を読み、lodashを構成するいくつかのポイントアンダースコアよりもはるかに優れているのは次のとおりです。
それは速度の問題ではなく、速度の一貫性(?)
アンダースコアのソースコードを見ると、最初の数行で、多くの関数のネイティブ実装でのアンダースコアのフォールバックがわかります。理想的な世界では、これはより良いアプローチでしたが、これらのスライドに示されているパフォーマンスリンクの一部を見ると、これらの「ネイティブ実装」の品質がブラウザによって大きく異なるという結論を導くのは難しくありません。ブラウザへ。Firefoxは、一部の機能では非常に高速で、一部のChromeでは支配的です。(IEも支配するいくつかのシナリオがあると思います)。私は、ブラウザー間でパフォーマンスがより一貫しているコードを好む方が良いと思います。
以前にブログの投稿を読んでください。それを信じるためではなく、ベンチマークを実行して判断してください。Chromeのようなシンプルでネイティブな関数でさえ、アンダースコアよりも100〜150%高速にロダッシュが実行されるのを見ていると、私は今驚かさ
Array.everyれます!
lodash の追加も非常に便利です。
lodash の違いのリストを以下に示します。アンダースコアビルドは、アンダースコアプロジェクトのドロップイン置換です。
これは2014年で、数年では遅すぎます。それでも私は私の主張が保持すると思います:
私見この議論はかなり比例して吹き飛ばされました。前述のブログ投稿を引用:
Underscore、Valentine、wuなどのほとんどのJavaScriptユーティリティライブラリは、「ネイティブファーストデュアルアプローチ」に依存しています。このアプローチはネイティブ実装を優先し、同等のネイティブがサポートされていない場合にのみバニラJavaScriptにフォールバックします。しかし、jsPerfは興味深い傾向を明らかにしました。配列または配列のようなコレクションを反復処理する最も効率的な方法は、ネイティブ実装を完全に回避し、代わりに単純なループを選択することです。
「単純なループ」と「バニラJavascript」は、配列またはオブジェクトメソッドの実装よりもネイティブであるかのようです。ねえ…
確かに単一の真実の情報源があればいいのですが、そうではありません。あなたが他のことを言われたとしても、私の愛するバニラ神は存在しません。申し訳ありません。本当に当てはまる唯一の前提は、すべての主要なブラウザーで良好に機能することを目的としたJavascriptコードを作成し、それらすべてに同じものの異なる実装があることを知っていることです。それは、穏やかに言えば、対処する雌犬です。しかし、それが好きかどうかにかかわらず、それが前提です。
たぶん、みんながツイッターのようなパフォーマンスを必要とする大規模なプロジェクトに取り組んでいるので、現在、1秒あたりのリストの850,000(アンダースコア)と2,500,000(ロダッシュ)の反復の違いが実際にわかります。
私は一人ではありません。つまり、パフォーマンスの問題に対処しなければならないプロジェクトで作業しましたが、アンダースコアやLo-Dashによって解決または発生することはありませんでした。そして、実装とパフォーマンスの真の違い(現在C ++について話している)を取得できない限り、反復可能オブジェクト(オブジェクトまたは配列、スパースであるかどうかにかかわらず)のループを言うことができれば、私はむしろ気になりませんすでに意見が分かれているベンチマークプラットフォームの結果に基づいた主張。
Rhinoは、1つの「中世ループメソッドがより優れて永遠に実行されず、何もない」という司祭が、すべてのFFの突然の配列メソッドは、彼/彼女の独断的なブレインファックよりもはるかに高速です。ランタイム環境をだますことによって、ランタイム環境をだますことはできません。促進するときにそれについて考えてください...
あなたのユーティリティベルト
... 次回。
それを適切に保つには:
ニーズに最も適合するアプローチを選択してください。いつものように。私は、いつのまにかランタイムチートよりも実際の実装にフォールバックすることを望みますが、それは今日の好みの問題のようです。http://developer.mozilla.comやhttp://caniuse.comのような高品質のリソースに固執すれば、大丈夫です。
Array.from彼らはおそらくそれが何をすべきかさえ知らないでしょう。JSの「ユーティリティベルト」の人々は、非常に一般的な回避策の宣伝にあまりにも関心を寄せているようで、そうすることで忘れてしまう傾向があり、実際には標準化プロセスが薄められています。機能の必要がないため、ブラウザの「製造元」に圧力がかかりません。楽しい事実:4の主要なブラウザの2は、オープンソース・プロジェクト(に基づいている1、2)。
ここで述べたことのほとんどに同意しますが、underscore.jsを支持する議論、つまりライブラリーのサイズを指摘したいだけです。
特にモバイルデバイスで主に使用する予定のアプリまたはWebサイトを開発している場合は、結果のバンドルのサイズと、起動時間またはダウンロード時間への影響が重要な役割を果たす可能性があります。
比較のために、これらのサイズは、ionic serveを実行した後にsource-map-explorerで気付いたサイズです。
lodash: 523kB
underscore.js: 51.6kb
2020年2月に編集:
BundlePhobiaを使用して、ローダッシュとアンダースコアの現在のサイズを確認できます
source-map-explorer after running ionic serve
それがOPの意味するものかどうかはわかりませんが、アンダースコアからロダッシュに移行するときに留意する必要がある問題のリストを探していたため、この質問に遭遇しました。
誰かがそのような違いの完全なリストを載せた記事を投稿していただければ本当にありがたいです。難しい方法で学んだこと(つまり、コードが本番環境で爆発する原因となったもの:/)から始めましょう。
_.flattenアンダースコアはデフォルトで深いので、浅くするには2番目の引数としてtrueを渡す必要があります。lodashでは、デフォルトで浅く、2番目の引数がそれを深くするのでtrueを渡す!:)_.lastアンダースコアでは、必要な要素の数を示す2番目の引数を受け入れます。そのlodashようなオプションはありません。あなたはこれをエミュレートすることができます.slice_.first (同じ問題)_.templateアンダースコアはさまざまな方法で使用できます。その1つはテンプレート文字列とデータを提供し、それを取得するHTMLことです(または、少なくともそれが少し前に機能した方法です)。ではlodashもしあなたが、その後データを養う必要がある機能を受け取ります。_(something).map(foo)アンダースコアで動作しますが、lodashではそれをに書き換える必要がありました_.map(something,foo)。多分それはただのTypeScript問題でした_(something).map(foo).value()。
http://benmccormick.org/2014/11/12/underscore-vs-lodash/
ベンマコーミックによる2つを比較する最新の記事:
Lo-DashのAPIはUnderscoreのスーパーセットです。
内部で[Lo-Dash]が完全に書き直されました。
Lo-DashはUnderscoreよりも遅くはありません。
Lo-Dashには何が追加されていますか?
- 操作性の向上
- 追加機能
- パフォーマンスの向上
- 連鎖の省略構文
- 必要なものだけを使用するカスタムビルド
- セマンティックバージョニングと100%コードカバレッジ
私にとって重要な違いが1つ見つかりました。下線と互換性の_.extend()ないバージョンのlodash は、クラスレベルで定義されたプロパティまたはメソッドをコピーしません。
これを実証するJasmineテストをCoffeeScriptで作成しました。
https://gist.github.com/softcraft-development/1c3964402b099893bd61
幸い、lodash.underscore.jsすべてをコピーするというUnderscoreの動作が維持されます。これは、私の状況では望ましい動作でした。
ほとんどの場合、アンダースコアはlodashのサブセットです。時々、現在アンダースコアのように、lodashがmapObjectのように持っていないかっこいい小さな関数があるでしょう。これにより、プロジェクトの開発に多くの時間を節約できました。
彼らはロダッシュとかなり似ていますが引き継いでいます...
どちらも、JavaScriptのユーティリティの世界を取り入れたユーティリティライブラリです...
思わLodashは今より定期的に更新するので、より最新のプロジェクトに慣れています...
また、Lodashは数KBだけ軽量化されているようです...
どちらもapiとdocは優れていますが、Lodashだと思います方が良い ...
これは、配列の最初の値を取得するための各ドキュメントのスクリーンショットです...
下線:
状況は随時更新される可能性があるため、ウェブサイトも確認してください...