underscore.js - tutorial - node js underscore




Unterschiede zwischen lodash und unterstreichen (8)

Warum sollte jemand die lodash.js oder underscore.js dem anderen vorziehen?

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.


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

IMHO wurde diese Diskussion ziemlich übertrieben. Zitieren des oben genannten Blogposts :

Die meisten JavaScript-Dienstprogrammbibliotheken wie Underscore, Valentine und wu basieren auf dem "nativ-ersten dualen Ansatz". Dieser Ansatz bevorzugt native Implementierungen und greift nur dann auf Vanilla-JavaScript zurück, wenn das systemeigene Gegenstück nicht unterstützt wird. Aber jsPerf hat einen interessanten Trend aufgezeigt: Die effizienteste Möglichkeit, über eine Array- oder Array-ähnliche Sammlung zu iterieren, besteht darin, die nativen Implementierungen vollständig zu vermeiden und stattdessen einfache Loops zu verwenden.

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, so dass Sie wirklich den Unterschied zwischen 850.000 (Unterstrich) vs. 2.500.000 (lodash) Iterationen über eine Liste pro Sekunde sehen !

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 bereits standardisierten Benchmark-Plattform.

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 können 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 ihren ( John-David und Jeremy ) 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. Halten Sie sich an Qualitätsressourcen wie http://developer.mozilla.com und http://caniuse.com und Sie werden gut.


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 in Unterstrichen sind standardmäßig tief und du musst als zweites Argument wahr werden, um es flach zu machen. In lodash ist es standardmäßig seicht und wird als zweites Argument wahr! :)
  • _.last in Unterstrich akzeptiert ein zweites Argument, das _.last , wie viele Elemente Sie möchten. In lodash gibt es keine solche Wahlmöglichkeit. Sie können dies mit .slice emulieren
  • _.first (gleiche Ausgabe)
  • _.template in Unterstreichung kann auf viele Arten verwendet werden, von denen eine die Vorlage Zeichenkette und Daten zur Verfügung stellt und HTML zurückbekommt (oder zumindest so hat es vor einiger Zeit funktioniert). In lodash erhalten Sie eine Funktion, die Sie dann mit den Daten füttern sollten.
  • _(something).map(foo) arbeitet in Unterstrich, aber in lodash musste ich es in _.map(something,foo) umschreiben. Vielleicht war das nur ein TypeScript Problem

Ich habe nur einen Unterschied gefunden, der für mich wichtig war. Die nicht unterstreichkompatible Version von lodashs _.extend() keine Eigenschaften oder Methoden auf Klassenebene.

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

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

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


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 Auswirkung 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

Lo-Dash ist inspiriert von Unterstreichung, aber heutzutage ist überlegene Lösung. Sie können Ihre benutzerdefinierten Builds erstellen , haben eine höhere Leistung , unterstützen AMD und haben tolle Zusatzfunktionen . Überprüfen Sie diese Lo-Dash vs Underscore Benchmarks auf Jsperf und .. dieser tolle Beitrag ü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 }]

(aus der Dokumentation von lodash )


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

Hier ist der aktuelle Stand für die Nachwelt:

  • Unterstrich _.compose ist Lodash _.flowRight
  • Unterstrich _.contains ist Lodash _.includes
  • Unterstrich _.findWhere ist Lodash _.find
  • Underscore _.invoke ist Lodash _.invokeMap
  • Unterstrich _.mapObject ist Lodash _.mapValues
  • Unterstrich _.pluck ist Lodash _.map
  • Unterstrich _.where ist Lodash _.filter
  • Unterstrich _.any ist Lodash _.some
  • Unterstrich _.all ist Lodash _.every
  • Underscore _.each erlaubt das Beenden nicht durch Rückgabe von false
  • Underscore _.flatten ist standardmäßig tief, während Lodash flach ist
  • Underscore _.isFinite stimmt nicht mit Number.isFinite
    (zB _.isFinite('1') gibt true in Underscore zurück, aber false in Lodash)
  • Underscore _.matches unterstützt keine tiefen Vergleiche
    (zB _.filter(objects, { 'a': { 'b': 'c' } }) )
  • Underscore ≥ 1.7 & Lodash haben ihre _.template Syntax in geändert
    _.template(string, option)(data)
  • Lodash _.uniq akzeptiert keine iteratee Funktion wie Underscore. Verwenden Sie Lodash _.uniqBy
  • Lodash _.first und ._last akzeptieren kein Argument wie Underscore. Verwenden Sie slice
  • Lodash _.memoize Caches sind _.memoize Objekte
  • Lodash unterstützt implizites Verketten , Lazy Chaining und Shortcut-Fusion
  • Lodash spaltete seine überladene _.head , _.last , _.rest , & _.initial in
    _.take , _.takeRight , _.drop , & _.dropRight
    ( _.head(array, 2) in Underscore ist _.take(array, 2) in Lodash)

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

lodash hat _.mapValues() was identisch mit dem _.mapObject() der _.mapObject() .