Skillnader mellan lodash och underscore

Varför skulle någon föredra antingen lodash.js eller underscore.js framför varandra?

Lodash verkar vara en ersättare för underscore, eftersom det senare har funnits längre.

Jag tycker att båda är lysande, men jag vet inte tillräckligt mycket om hur de fungerar för att kunna göra en välgrundad jämförelse, och jag skulle vilja veta mer om skillnaderna.

Lösning

Jag skapade Lo-Dash för att ge ett mer konsekvent iterationsstöd för arrayer, strängar, objekt och arguments-objekt1. Det har sedan dess blivit en överordning av Underscore, som ger ett mer konsekvent API-beteende, fler funktioner (som AMD-stöd, deep clone och deep merge), grundligare dokumentation och enhetstester (tester som körs i Node, Ringo, Rhino, Narwhal, PhantomJS och webbläsare), bättre övergripande prestanda och optimeringar för iteration av stora matriser/objekt och större flexibilitet med custom builds och verktyg för förkompilering av mallar.

Eftersom Lo-Dash uppdateras oftare än Underscore, tillhandahålls en lodash underscore-byggnad för att säkerställa kompatibilitet med den senaste stabila versionen av Underscore.

Vid ett tillfälle fick jag till och med push access till Underscore, delvis på grund av att Lo-Dash är ansvarig för att ha tagit upp mer än 30 problem; landning av felrättningar, nya funktioner och förbättrad prestanda i Underscore v1.4.x+.

Dessutom finns det minst tre Backbone boilerplates som innehåller Lo-Dash som standard och Lo-Dash nämns nu i Backbones officiella dokumentation.

Kolla in Kit Cambridges inlägg Say "Hello" to Lo-Dash för en djupare genomgång av skillnaderna mellan Lo-Dash och Underscore.

Fotnoter:

  1. Underscore har inkonsekvent stöd för matriser, strängar, objekt och arguments-objekt. I nyare webbläsare ignorerar Underscore-metoder hål i matriser, "Objects"-metoder itererar arguments-objekt, strängar behandlas som matrisliknande och metoder itererar korrekt funktioner (ignorerar deras "prototype"-egenskap) och objekt (itererar skuggade egenskaper som "toString" och "valueOf"), medan de inte gör det i äldre webbläsare. Dessutom bevarar Underscore-metoder som _.clone hål i matriser, medan andra som _.flatten inte gör det.
Kommentarer (22)

Lo-Dash är inspirerad av underscore, men är numera en bättre lösning. Du kan göra dina anpassade byggen, få högre prestanda, stöd för AMD och fantastiska extrafunktioner. Kolla in detta Lo-Dash vs Underscore benchmarks på jsperf och detta awesome post about lo-dash:

En av de mest användbara funktionerna när du arbetar med samlingar är den kortfattade syntaxen:

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

(hämtad från lodash docs)

Kommentarer (4)

Förutom Johns svar och att jag läste på om lodash (som jag hittills hade betraktat som en "me-too" till underscore), och såg prestandatester, läste källkoden och [blogginlägg] (http://kitcambridge.be/blog/say-hello-to-lo-dash/), är de få punkter som gör att lodash är mycket bättre än underscore dessa:

  1. Det handlar inte om hastigheten, utan om konsistens i hastigheten (?).

    Om du tittar i underscores källkod ser du i de första raderna att underscore faller tillbaka på de inhemska implementeringarna av många funktioner. Även om detta i en idealisk värld skulle ha varit ett bättre tillvägagångssätt, är det inte svårt att dra slutsatsen att kvaliteten på dessa "inhemska implementationer" varierar mycket från webbläsare till webbläsare om man tittar på några av de perf-länkar som anges i [dessa bilder] (http://allyoucanleet.com/post/21624742336/jsconf-us-12-slides). Firefox är jäkligt snabb i vissa av funktionerna, och i vissa dominerar Chrome. (Jag kan tänka mig att det skulle finnas vissa scenarier där IE också skulle dominera). Jag tror att det är bättre att föredra en kod vars prestanda är mer konsekvent mellan olika webbläsare.

Läs blogginlägget tidigare, och i stället för att tro på det för dess skull, döm själv genom att köra [benchmarks] (http://lodash.com/benchmarks). Jag är förbluffad just nu när jag ser en lodash prestera 100-150% snabbare än underscore i till och med simpla, nativa funktioner som Array.every i Chrome!

  1. De extras i lodash är också ganska användbara.
  2. När det gäller Xananax mycket uppröstade kommentar som föreslår bidrag till underscore's kod: Det är alltid bättre att ha GOD konkurrens, det håller inte bara innovationen igång utan driver dig också att hålla dig själv (eller ditt bibliotek) i god form.

Här är en [lista över skillnader] (https://github.com/bestiejs/lodash/wiki/build-differences) mellan lodash och dess underscore-build är en drop-in ersättning för dina underscore-projekt.

Kommentarer (12)