web-dev-qa-db-ja.com

lodashとunderscoreの違い

なぜ誰かが lodash.js または underscore.js ユーティリティを好むのはなぜでしょう。他の上のライブラリ?

Lodashはアンダースコアの代わりになるものと思われますが、後者は長めのものでした。

私は両方とも素晴らしいと思いますが、私は彼らが教育を受けた比較をするためにどのように働くかについて十分に知りません、そして私は違いについてもっと知りたいです。

1516
Brian M. Hunt

配列、文字列、オブジェクト、および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 を参照してください。

脚注:

  1. Underscoreは、配列、文​​字列、オブジェクト、およびargumentsオブジェクトのサポートに一貫性がありません。新しいブラウザでは、Underscoreメソッドは 配列の穴 を無視し、 "Objects"メソッドはargumentsオブジェクトを反復し、文字列は配列のように扱われ、メソッドは関数を正しく反復します( "prototype"プロパティは無視)およびオブジェクト(反復) "toString"や "valueOf"のような影付きのプロパティ)、古いブラウザではそうではありません。また、_.cloneのようなアンダースコアのメソッドは配列の穴を保存しますが、_.flattenのようなアンダースコアのメソッドは保存しません。
1929

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 から取得)

180
neiker

私と同じように、アンダースコアと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です
  • アンダースコア_.isFiniteNumber.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)です)
75
Iest

Johnの答え、そしてlodash(これまで私はアンダースコアの「私も」と見なしていました)を読んで、パフォーマンステストを見て、ソースコードを読んで、そして ブログの投稿 、lodashがアンダースコアよりもはるかに優れている点は次のとおりです。

  1. それはスピードのことではありません、それは 一貫性 スピードのことです(?)

    アンダースコアのソースコードを調べると、最初の数行にアンダースコアが多くの関数のネイティブ実装に頼っていることがわかります。理想的な世界では、これはより良いアプローチでしたが、 これらのスライド に記載されているperfリンクを見れば、それほど難しくありません。これらの「ネイティブ実装」の品質はブラウザごとに大きく異なるという結論を導きます。 Firefoxは、いくつかの機能において非常に高速であり、いくつかのChromeにおいて優勢です。 (私はIEが支配するシナリオもいくつかあると思います)。私は、パフォーマンスがブラウザ間でより一貫しているコードを好む方が良いと思います。

    ブログの投稿を先に読んでください。そのためにそれを信じる代わりに、 ベンチマーク を実行して判断してください。 ChromeのArray.everyのような simple native 関数でも、アンダースコアよりも100〜150%高速なlodashの実行が見られます。

  2. Lodashのextrasも非常に便利です。

  3. アンダースコアのコードへの貢献を示唆しているXananaxの非常に支持されたコメントに関しては:GOOD競争をすることは常に革新を続けているだけでなく、あなた自身を保つためにあなたを動かしますまたはあなたのライブラリー).

これは、lodash間の 相違点 のリストです。アンダースコアビルドは、アンダースコアプロジェクトの代わりとなるドロップインです。

60
kumar_harsh

これは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の突然の配列メソッドは、彼/彼女の説得力のあるブレインファックよりはるかに速いです。あなたのランタイム環境をだますことによってあなたのランタイム環境をだますことはできません!昇進するときそれについて考えなさい….

あなたの実用的なベルト

... 次回。

関連性を保つために:

  • あなたがネイティブっぽさを犠牲にせずに利便性に興味があればアンダースコアを使用してください。
  • 利便性が高く、拡張機能カタログ(ディープコピーなど)が好きで、即席のパフォーマンスが必要な場合や、ネイティブAPIがすぐになくなってすぐに代替手段を使用する必要がない場合は、Lo-Dashを使用してください。定評のあるワークアラウンド。それはまもなく起こるでしょう。期間。
  • 第三の解決策さえあります。 DIY!あなたの環境を知っています。矛盾について知ってください。 ( John-DavidJeremy の)コードを読んでください。これを使用しないでください。一貫性/互換性レイヤーが本当に必要であり、ワークフローを強化したり、アプリケーションのパフォーマンスを向上させたりする理由を説明できないのです。あなたの要求があなたが完全に自分自身で書くことができるという単純なpolyfillで満たされていることは非常にありそうです。どちらのライブラリも、ほんのちょっと砂糖が入った単なるバニラです。 彼らはどちらも、誰が最も甘いパイを出しているのかと争うだけです 。しかし、私は信じて、結局のところ両方とも水で調理するだけです。バニラの神は存在しないので、バニラの法王は存在できないのではないでしょうか。

自分のニーズに最も合ったアプローチを選択してください。いつものように。私はいつでも意見のあるランタイムの詐欺より実際の実装でのフォールバックを好みますが、それでも最近では好みの問題のようです。 http://developer.mozilla.com および http://caniuse.com のような質の高いリソースにこだわります。ただ大丈夫です。

43
Lukas Bünger

私はここで述べたことの大部分に同意しますが、私はただunderscore.jsを支持する議論を指摘したいと思います:ライブラリのサイズです。

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

比較のために、これらのサイズはionive serveを実行した後にsource-map-Explorerで気づいたものです。

lodash: 523kB
underscore.js: 51.6kb
16
David Dal Busco

それが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でした
10
qbolec

http://benmccormick.org/2014/11/12/underscore-vs-lodash/

Ben McCormickによる両者を比較した最新の記事:

  1. Lo-DashのAPIは、アンダースコアのAPIのスーパーセットです。

  2. フードの下に[Lo-Dash]は完全に書き直されました。

  3. ローダッシュは確かにアンダースコアより遅くはありません。

  4. Lo-Dashは何を追加しましたか?

    • ユーザビリティの向上
    • 追加機能
    • パフォーマンス向上
    • 連鎖のための速記構文
    • あなたが必要とするものだけを使うカスタムビルド
    • セマンティックバージョニングと100%コードカバレッジ
8
pilau

1つの違いが私にとって重要であることがわかりました。 lodashの_.extend()の非アンダースコア互換バージョンは、notクラスレベルで定義されたプロパティまたはメソッドをコピーします。

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

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

幸いなことに、lodash.underscore.jsはすべてをコピーするというUnderscoreの振る舞いを保持しています。

6
Craig Walker

lodash_.mapValues()を持っていますが、これはunderescoreの_.mapObject()と同じです。

3
artknight

ほとんどの場合、アンダースコアはlodashのサブセットです。時々、現在アンダースコアのように、lodashがmapObjectのように持っていないクールな小さな関数を持つでしょう。これは私のプロジェクトの開発において多くの時間を節約しました。

0
rashadb

それらはかなり似ており、Lodashが引き継いでいます...

どちらもJavaScriptのユーティリティの世界を取り込んだユーティリティライブラリです...

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

また、Lodashは数KBほど軽いようです...

両方とも良いAPIとドキュメントを持っていますが、Lodashの方が良いと思います...

以下は、配列の最初の値を取得するための各ドキュメントのスクリーンショットです...

アンダースコア:

underscore

lodash:lodash

状況は時々更新される可能性があるため、ウェブサイトも確認してください...

lodash

アンダースコア

0
Alireza