Frage Unterschiede zwischen lodash und unterstreichen


Warum sollte jemand das bevorzugen? lodash.js oder Unterstrich.js Dienstprogramm Bibliothek über die andere?

Lodash scheint ein Drop-In-Ersatz für die Unterstreichung zu sein, letzterer war länger da.

Ich denke beide sind brillant, aber ich weiß nicht genug darüber, wie sie arbeiten, um einen fundierten Vergleich zu erstellen, und ich würde gerne mehr über die Unterschiede erfahren.


1400
2017-12-09 17:08


Ursprung


Antworten:


Ich habe Lo-Dash erstellt, um eine konsistentere Unterstützung von Arrays, Strings, Objekten und arguments Objekte1. Es wurde zu einer Obermenge von Underscore, die mehr konsistentes API-Verhalten bietet Eigenschaften (wie AMD-Unterstützung, Deep Clone und Deep Merge), gründlicher Dokumentation und Komponententests (Tests, die in Node, Ringo, Rhino, Narwhal, PhantomJS und Browsern ausgeführt werden), bessere Gesamtleistung und Optimierungen für große Arrays / Objekteriteration und mehr Flexibilität mit benutzerdefinierte Builds und Vorkompilierungsprogramme für die Vorlage.

Da Lo-Dash häufiger aktualisiert wird als Underscore, a lodash underscore bauen wird gestellt um Kompatibilität mit der neuesten stabilen Version von Underscore zu gewährleisten.

Irgendwann wurde mir sogar gegeben Push-Zugriff zu Underscore, zum Teil, weil Lo-Dash für mehr als 30 Probleme verantwortlich ist; Fehlerbehebungen bei der Landung, neue Funktionen und Verbesserungen in Underscore v1.4.x +.

Darüber hinaus gibt es mindestens 3 Backbone-Bausteine, die standardmäßig Lo-Dash enthalten und Lo-Dash wird jetzt in Backbones Offiziellen erwähnt Dokumentation.

Schau dir den Beitrag von Kit Cambridge an, Sag "Hallo" zu Lo-Dash, für einen tieferen Zusammenbruch der Unterschiede zwischen Lo-Dash und Underscore.

Fußnoten:

  1. Unterstreichung hat inkonsistente Unterstützung für Arrays, Strings, Objekte und arguments Objekte. In neueren Browsern ignorieren Underscore-Methoden Löcher in Arrays, "Objects" Methoden iterieren arguments Objekte, Strings werden als array-artig behandelt, und Methoden iterieren Funktionen (Ignorieren ihrer "Prototyp" -Eigenschaft) und Objekte (wiederholte Schatteneigenschaften wie "toString" und "valueOf"), während dies in älteren Browsern nicht der Fall ist. Auch Underscore-Methoden mögen _.clone Löcher in Arrays erhalten, während andere mögen _.flatten nicht.

1777
2017-12-16 05:34



Lo-Dash ist inspiriert von Unterstreichung, aber heutzutage ist überlegene Lösung. Sie können Ihre machen benutzerdefinierte Builds, habe einen höhere Leistung, unterstützen AMD und haben tolle Extras. Überprüfen Sie dies Lo-Dash vs Underscore-Benchmarks auf Jsperf und .. dies toller Post über Lo-Dash:

Eines der nützlichsten Features bei der Arbeit mit Sammlungen ist die Kurzschriftsyntax:

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 }]

(genommen von lodash Dokumente)


165
2017-12-13 21:51



Zusätzlich zu Johns Antwort und dem Lesen von lodash (was ich bisher als ein "Ich-zu" betrachtet hatte), und das Sehen der Leistungstests, das Lesen des Quellcodes und BlogeinträgeDie wenigen Punkte, die lodash der Unterstreichung überlegen machen, sind diese:

  1. Es geht nicht um die Geschwindigkeit, wie es geht Konsistenz der Geschwindigkeit (?)

    Wenn Sie sich den Quellcode des Unterstrichs ansehen, werden Sie in den ersten Zeilen sehen, dass die nativen Implementierungen vieler Funktionen durch Unterstreichungen ersetzt werden. In einer idealen Welt wäre dies ein besserer Ansatz gewesen, wenn man sich einige der in diese FolienEs ist nicht schwierig, die Schlussfolgerung zu ziehen, dass die Qualität dieser "nativen Implementierungen" von Browser zu Browser sehr unterschiedlich ist. Firefox ist verdammt schnell in einigen Funktionen, und in einigen Chrome dominiert. (Ich könnte mir vorstellen, dass es einige Szenarien geben würde, in denen IE auch dominieren würde). Ich glaube, dass es besser ist, einen Code zu bevorzugen, dessen Performance ist konsistenter über Browser hinweg.

    Lesen Sie den Blogpost früher, und anstatt es zu glauben, urteilen Sie selbst, indem Sie die Benchmarks. Ich bin gerade verblüfft, wenn ich sehe, dass ein Lodash 100-150% schneller ist als ein Unterstrich einfach, einheimisch Funktionen wie Array.every in Chrome!

  2. Das Extras in lodash sind auch ziemlich nützlich.

  3. Was Xananax's hoch bewerteten Kommentar angeht, der einen Beitrag zum Unterstrich-Code vorschlägt: Es ist immer besser zu haben GUT Wettbewerb, hält Innovation nicht nur in Gang, sondern treibt Sie auch dazu, sich (oder Ihre Bibliothek) in guter Verfassung zu halten.

Hier ist ein Liste der Unterschiede zwischen lodash, und es ist Understroke-Build ein Drop-in-Ersatz für Ihre Unterstriche Projekte.


57
2017-08-18 14:18



Wenn Sie wie ich eine Liste der Nutzungsunterschiede zwischen Unterstrich und lodash erwarten, gibt es eine Leitfaden für die Migration von Unterstrich zu Lodash.

Hier ist der aktuelle Stand für die Nachwelt:

  • Unterstreichen _.compose ist Lodasch _.flowRight
  • Unterstreichen _.contains ist Lodasch _.includes
  • Unterstreichen _.findWhere ist Lodasch _.find
  • Unterstreichen _.invoke ist Lodasch _.invokeMap
  • Unterstreichen _.mapObject ist Lodasch _.mapValues
  • Unterstreichen _.pluck ist Lodasch _.map
  • Unterstreichen _.where ist Lodasch _.filter
  • Unterstreichen _.any ist Lodasch _.some
  • Unterstreichen _.all ist Lodasch _.every
  • Unterstreichen _.each erlaubt kein Beenden durch Zurückkehren false
  • Unterstreichen _.flatten ist standardmäßig tief, während Lodash flach ist
  • Unterstreichen _.isFinite stimmt nicht mit überein Number.isFinite
       (z.B. _.isFinite('1') kehrt zurück true in Underscore aber false im   Laschasch)
  • Unterstreichen _.matches Kurzschrift unterstützt keine tiefen Vergleiche
       (z.B. _.filter(objects, { 'a': { 'b': 'c' } }))
  • Underscore ≥ 1.7 & Lodash haben ihre geändert _.template Syntax zu
    _.template(string, option)(data)
  • Lodasch _.uniq akzeptiert kein iteratee funktionieren wie Underscore. Benutze Lodash _.uniqBy
  • Lodasch _.first und ._last Akzeptiere keine n Argument wie Underscore. Benutzen slice
  • Lodasch _.memoize Caches sind Map wie Objekte
  • Lodash unterstützt implizite Verkettung, faule Verkettung und Verknüpfung   Verschmelzung
  • Lodash spaltete seine überladenen _.head, _.last, _.rest, & _.initial hinaus in
      _.take, _.takeRight, _.drop, &    _.dropRight
       (d.h. _.head(array, 2) in Underscore ist    _.take(array, 2) in Lodasch)

55
2017-07-21 09:35



Das ist 2014 und ein paar Jahre zu spät. Trotzdem denke ich, dass mein Punkt gilt:

IMHO wurde diese Diskussion ziemlich übertrieben. Zitieren der zuvor genannten Blogeintrag:

Die meisten JavaScript-Hilfsprogrammbibliotheken wie Underscore, Valentine und   Wu, verlassen Sie sich auf den "nativ-ersten dualen Ansatz". Dieser Ansatz bevorzugt   native Implementierungen, die nur dann auf Vanilla JavaScript zurückfallen, wenn der   natives Äquivalent wird nicht unterstützt. Aber jsPerf hat eine interessante Entdeckung gemacht   trend: der effizienteste Weg, um über ein Array oder ein Array zu iterieren   collection soll die nativen Implementierungen vollständig vermeiden und sich dafür entscheiden   einfache Schleifen stattdessen.

Als ob "einfache Schleifen" und "Vanille-Javascript" nativer sind als Array- oder Object-Methodenimplementierungen. Meine Güte ...

Es wäre sicherlich schön, eine einzige Quelle der Wahrheit zu haben, aber das ist nicht der Fall. Selbst wenn dir etwas anderes gesagt worden wäre, es gibt keinen Vanilla Gott, meine Liebe. Es tut mir Leid. Die einzige Annahme, die wirklich gilt, ist, dass wir alle Javascript-Code schreiben, der darauf abzielt, in allen wichtigen Browsern gut zu funktionieren, wissend, dass alle von ihnen verschiedene Implementierungen der gleichen Dinge haben. Es ist eine Hündin, um damit umzugehen, um es milde auszudrücken. Aber das ist die Prämisse, ob Sie es mögen oder nicht.

Vielleicht arbeiten Sie an großen Projekten, die zwitschernde Leistung benötigen, damit Sie wirklich den Unterschied sehen zwischen 850.000 (Unterstrich) vs. 2.500.000 (lodash) Iterationen über eine Liste pro Sekunde jetzt sofort!

Ich für einen bin ich nicht. Ich meine, ich arbeitete an Projekten, bei denen es um Performance-Probleme ging, die aber weder von Underscore noch von Lo-Dash gelöst oder verursacht wurden. Und wenn ich nicht die wirklichen Unterschiede in der Implementierung und Leistung (wir sprechen gerade von C ++) von einer Schleife über eine iterierbare (Objekt oder Array, spärlich oder nicht!), Bekomme ich eher nicht mit irgendwelchen belästigt Ansprüche basierend auf den Ergebnissen einer Benchmark-Plattform, die ist schon eigensinnig.

Es braucht nur ein einziges Update von zB Rhino, um seine Array-Methoden-Implementierungen in einer Weise in Brand zu setzen, dass keine einzige "mittelalterliche Loop-Methode besser und für immer funktioniert und was nicht" Priester sich um die einfache Tatsache, dass alle argumentieren kann eine plötzliche Array-Methoden in FF sind viel schneller als seine / ihre Meinung brainfuck. Mann, Sie können Ihre Laufzeitumgebung einfach nicht betrügen, indem Sie Ihre Laufzeitumgebung betrügen! Denken Sie darüber nach, wenn Sie ...

Ihr Utility-Gürtel

... nächstes Mal.

Um es relevant zu halten:

  • Verwenden Sie Underscore, wenn Sie in Bequemlichkeit sind, ohne native ish zu opfern.
  • Verwenden Sie Lo-Dash, wenn Sie auf Komfort und seinen erweiterten Feature-Katalog (Deep Copy usw.) Wert legen und wenn Sie dringend sofortige Leistung benötigen und vor allem nichts dagegen haben, sich für eine Alternative zu entscheiden, sobald die nativen APIs überstrahlen eigensinnige Workaurounds. Was wird bald passieren. Zeitraum.
  • Es gibt sogar eine dritte Lösung. DIY! Kenne deine Umgebungen. Wissen über Inkonsistenzen. Lesen Sie ihre (John-Davidund Jeremy(s) Code. Verwenden Sie dieses oder jenes nicht, ohne in der Lage zu sein zu erklären, warum ein Konsistenz- / Kompatibilitätslayer wirklich benötigt wird, und verbessert Ihren Workflow oder verbessert die Leistung Ihrer App. Es ist sehr wahrscheinlich, dass Ihre Anforderungen mit einem einfachen Polyfill erfüllt sind, das Sie selbst schreiben können. Beide Bibliotheken sind einfach nur Vanille mit ein bisschen Zucker. Sie streiten sich beide darum, wer den süßesten Kuchen serviert. Aber glaubt mir, am Ende kochen beide nur mit Wasser. Es gibt keinen Vanillegott, also kann es keinen Vanillepapst geben, oder?

Wählen Sie den Ansatz, der am besten zu Ihren Bedürfnissen passt. Wie gewöhnlich. Ich würde jederzeit Rückschläge auf tatsächliche Implementierungen über rechthaberische Laufzeit-Cheats bevorzugen, aber selbst das scheint heutzutage eine Frage des Geschmacks zu sein. Bleiben Sie bei hochwertigen Ressourcen wie http://developer.mozilla.com und http://caniuse.com und dir wird es gut gehen.


43
2017-09-11 21:27



Ich stimme den meisten hier genannten Aussagen zu, möchte aber nur auf ein Argument zugunsten von underscore.js hinweisen: die Größe der Bibliothek.

Speziell für den Fall, dass Sie eine App oder Website entwickeln, die hauptsächlich auf mobilen Geräten verwendet werden soll, können die Größe des resultierenden Pakets und die Auswirkungen auf die Boot- oder Downloadzeit eine wichtige Rolle spielen.

Zum Vergleich sind diese Größen diejenigen, die ich mit Source-Map-Explorer nach dem Ausführen von ionic serve festgestellt habe:

lodash: 523kB
underscore.js: 51.6kb

14
2018-04-26 14:20



Ich bin mir nicht sicher, ob das OP gemeint hat, aber ich kam über diese Frage, weil ich nach einer Liste von Problemen suchte, die ich bei der Migration von Unterstrich zu lodash beachten muss.

Ich würde es sehr schätzen, wenn jemand einen Artikel mit einer vollständigen Liste solcher Unterschiede veröffentlicht hätte. Lassen Sie mich mit den Dingen beginnen, die ich auf die harte Tour gelernt habe (also Dinge, die meinen Code bei der Produktion explodieren ließen: /):

  • _.flatten im Unterstrich ist standardmäßig tief und du musst als zweites Argument wahrgeben, um es flach zu machen. In lodash ist es standardmäßig seicht und wird als zweites Argument wahr! :)
  • _.last im Unterstrich akzeptiert ein zweites Argument, das angibt, wie viele Elemente Sie möchten. Im lodash Es gibt keine solche Option. Sie können dies mit emulieren .slice
  • _.first (gleicher Fehler)
  • _.template In Unterstreichung kann auf viele Arten verwendet werden, von denen eine die Vorlage Zeichenfolge und Daten bereitstellt und erhalten HTML zurück (oder so hat es zumindest vor einiger Zeit funktioniert). Im lodash Sie erhalten eine Funktion, die Sie dann mit den Daten füttern sollten.
  • _(something).map(foo) arbeitet in Unterstrich, aber in lodash musste ich es umschreiben _.map(something,foo). Vielleicht war das nur ein TypeScript-Problem

9
2018-03-25 12:16



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

Letzter Artikel vergleicht die beiden von Ben McCormick:

  1. Die API von Lo-Dash ist eine Obermenge von Underscore.

  2. Unter der Haube wurde [Lo-Dash] komplett neu geschrieben.

  3. Lo-Dash ist definitiv nicht langsamer als Underscore.

  4. Was hat Lo-Dash hinzugefügt?

    • Verbesserungen der Benutzerfreundlichkeit
    • Extra Funktionalität
    • Leistungsgewinne
    • Shorthand-Syntax für die Verkettung
    • Custom Builds, um nur das zu verwenden, was Sie brauchen
    • Semantische Versionierung und 100% Codeabdeckung

8
2017-12-07 12:19



Ich habe nur einen Unterschied gefunden, der für mich wichtig war. Die nicht unterstreichbare Version von lodash's _.extend() tut nicht Kopieren Sie über Klassen definierte Eigenschaften oder Methoden.

Ich habe einen Jasmine-Test in CoffeeScript erstellt, der folgendes demonstriert:

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

Glücklicherweise, lodash.underscore.js bewahrt das Verhalten von Underscore, alles zu kopieren, was für meine Situation das gewünschte Verhalten war.


5
2017-12-12 16:56



lodash hat bekommen _.mapValues() Das ist identisch mit Unterernoten _.mapObject().


4
2017-07-18 17:13



In den meisten Fällen Unterstreich ist Teilmenge von Lodash. Manchmal, wie der aktuelle Unterstrich, wird coole kleine Funktionen haben, die lodash nicht wie mapObject hat. Dieser hat mir viel Zeit bei der Entwicklung meines Projektes gespart.


0
2018-05-14 11:16