1686

なぜ誰かがLodashまたはUnderscore.jsユーティリティライブラリのどちらかを他よりも好むのでしょうか?

Lodashはアンダースコアのドロップイン代替品のようで、後者はもっと長く存在していました。

どちらも素晴らしいと思いますが、知識に基づいた比較を行うためにそれらがどのように機能するかについては十分にわかりません。違いについてもっと知りたいと思います。

4

12 に答える 12

2117

Lodashを作成して、配列、文​​字列、オブジェクト、およびargumentsオブジェクト1に対してより一貫性のある環境間の反復サポートを提供しました。それ以来、Underscore.jsのスーパーセットになり、より一貫性のあるAPI動作、より多くの機能(AMDサポート、ディープクローン、ディープマージなど)、より徹底的なドキュメントと単体テスト(Node.jsRingoJSRhinoで実行されるテスト)を提供します。 、NarwhalPhantomJS 、およびブラウザー)、大規模な配列/オブジェクトの反復のための全体的なパフォーマンスと最適化の向上、およびカスタムビルドとテンプレートの事前コンパイルユーティリティによる柔軟性の向上。

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に「こんにちは」と言ってください」をご覧ください。

脚注:

  1. Underscore.jsは、配列、文​​字列、オブジェクト、およびargumentsオブジェクトのサポートに一貫性がありません。新しいブラウザでは、Underscore.jsメソッドは配列の穴を無視し、「Objects」メソッドargumentsはオブジェクトを反復処理し、文字列は配列のように扱われ、メソッドは関数(「prototype」プロパティを無視)とオブジェクト(「toString」などのシャドウプロパティを反復処理)を正しく反復します。 "と"valueOf")、古いブラウザではそうではありません。また、のようなUnderscore.jsメソッド_.cloneは配列の穴を保持しますが、他のメソッドは保持_.flattenしません。
于 2012-12-16T05:34:06.213 に答える
197

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のドキュメントから取得)

于 2012-12-13T21:51:14.147 に答える
104

私のように、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
  • アンダースコア_.uniqiterateeLodashです_.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)
于 2016-07-21T09:35:51.107 に答える
60

ジョンの答えに加えて、Lodash(これまでUnderscore.jsにとって「私も」と見なしていた)を読み、パフォーマンステストを見て、ソースコードとブログ投稿を読んで、いくつかのポイントがありますLodashをUnderscore.jsよりもはるかに優れたものにする次のとおりです。

  1. それは速度の一貫性に関するものなので、速度に関するものではありません(?)

Underscore.jsのソースコードを調べると、最初の数行で、Underscore.jsが多くの関数のネイティブ実装にフォールバックしていることがわかります。理想的な世界では、これはより良いアプローチでしたが、これらのスライドに示されているパフォーマンスリンクのいくつかを見ると、これらの「ネイティブ実装」の品質がブラウザによって大きく異なるという結論を引き出すのは難しくありません。 to-ブラウザ。Firefoxはいくつかの機能で非常に高速であり、一部のChromeでは支配的です。(Internet Explorerも支配するシナリオがいくつかあると思います)。ブラウザ間でパフォーマンスがより一貫しているコードを選択する方が良いと思います。

以前にブログ投稿を読んでください、そしてそれのためにそれを信じる代わりに、ベンチマークを実行することによってあなた自身で判断してください。Chromeのような単純なネイティブ関数でも、LodashのパフォーマンスがUnderscore.jsよりも100〜150%速いのを見て、私は今驚いています。Array.every

  1. Lodashのエクストラも非常に便利です。
  2. Underscore.jsのコードへの貢献を示唆するXananaxの非常に賛成のコメントについては、次のように述べています。

Lodashの違いのリストは次のとおりです。Underscore.jsビルドは、Underscore.jsプロジェクトのドロップイン代替品です。

于 2013-08-18T14:18:59.610 に答える
42

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よりもはるかに高速です。男、あなたはあなたのランタイム環境をだますことによってあなたのランタイム環境をだますことはできません!宣伝するときはそれについて考えてください...

あなたのユーティリティベルト

... 次の時間。

したがって、関連性を保つために:

  • ネイティブっぽさを犠牲にすることなく便利な場合は、Underscore.jsを使用してください。
  • 便利で拡張機能カタログ(ディープコピーなど)が好きで、インスタントパフォーマンスが切実に必要であり、最も重要なこととして、ネイティブAPIの優れた意見が出たらすぐに代替手段を選択することを気にしない場合は、Lodashを使用してください。回避策。これはすぐに起こります。限目。
  • 3番目の解決策もあります。DIY!あなたの環境を知っています。不整合について知ってください。彼らの(John-DavidJeremyの)コードを読んでください。一貫性/互換性レイヤーが本当に必要であり、ワークフローを強化したり、アプリケーションのパフォーマンスを向上させたりする理由を説明できずに、これを使用しないでください。あなたの要件は、あなたが完全に自分で書くことができる単純なポリフィルで満たされている可能性が非常に高いです。どちらのライブラリも、ほんの少しの砂糖が入った単なるバニラです。彼らは両方とも、誰が最も甘いパイを提供しているかを争うだけです。しかし、私を信じてください、結局、両方とも水で料理しているだけです。バニラの神はいないので、バニラの教皇はいないはずですよね?

ニーズに最も適したアプローチを選択してください。いつものように。私はいつでも意見のあるランタイムチートよりも実際の実装へのフォールバックを好みますが、それでも最近は好みの問題のようです。http://developer.mozilla.comhttp://caniuse.comなどの高品質のリソースに固執すれば、問題はありません。

于 2014-09-11T21:27:19.333 に答える
25

ここで述べられていることのほとんどに同意しますが、Underscore.jsを支持する議論を指摘したいと思います。それはライブラリのサイズです。

特に、主にモバイルデバイスで使用することを目的としたアプリやウェブサイトを開発している場合は、結果のバンドルのサイズと、起動時間またはダウンロード時間への影響が重要な役割を果たす可能性があります。

比較のために、これらのサイズは、Ionicserveを実行した後にsource-map-explorerで気付いたサイズです。

Lodash: 523 kB
Underscore.js: 51.6 kB

BundlePhobiaを使用して、 LodashUnderscore.jsの現在のサイズを確認できます。

于 2017-04-26T14:20:40.207 に答える
11

それが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問題でした。
于 2015-03-25T12:16:40.717 に答える
8

BenMcCormickによるUnderscorevsLo-Dashは、2つを比較した最新の記事です。

  1. LodashのAPIは、Underscore.jsのスーパーセットです。
  1. 内部的には、Lodashは完全に書き直されています。
  1. Lodashは間違いなくUnderscore.jsより遅くはありません。
  1. Lodashは何を追加しましたか?
  • 操作性の向上
  • 追加機能
  • パフォーマンスの向上
  • 連鎖の省略構文
  • 必要なものだけを使用するカスタムビルド
  • セマンティックバージョニングと100%のコードカバレッジ
于 2014-12-07T12:19:52.743 に答える
6

私にとって重要な違いが1つ見つかりました。Underscore.jsと互換性のないバージョンのLodashは、クラスレベルで定義されたプロパティまたはメソッドをコピーし_.extend()ません。

これを実証するJasmineテストをCoffeeScriptで作成しました。

https://gist.github.com/softcraft-development/1c3964402b099893bd61

幸い、lodash.underscore.jsUnderscore.jsのすべてをコピーする動作は保持されます。これは、私の状況では望ましい動作でした。

于 2014-12-12T16:56:40.157 に答える
4

Lodashには_.mapValues()、Underscore.jsと同じものがあり_.mapObject()ます。

于 2015-07-18T17:13:58.243 に答える
0

ほとんどの場合、Underscore.jsはLodashのサブセットです。

時々、現在のように、Underscore.jsには、mapObjectのように、Lodashにはないクールな小さな機能があります。これにより、プロジェクトの開発にかかる時間を大幅に節約できました。

于 2015-05-14T11:16:42.313 に答える
0

それらは非常に似ており、Lodashが引き継いでいます...

どちらもJavaScriptのユーティリティの世界を取り入れたユーティリティライブラリです...

Lodashは現在、より定期的に更新されているようです。そのため、最新のプロジェクトでより多く使用されています...

また、 Lodashは2、3KBだけ軽いようです...

どちらも優れたAPIとドキュメントを備えていますが、 Lodashの方が優れていると思います...

これは、配列の最初の値を取得するための各ドキュメントアイテムのスクリーンショットです...

Underscore.js:

Underscore.js

Lodash:

Lodash

時々更新されるかもしれないので、彼らのウェブサイトもチェックしてください...

Lodash

Underscore.js

于 2019-01-19T06:48:34.973 に答える