Waarom zou iemand ofwel de lodash.js ofwel de underscore.js utility library verkiezen boven de andere?
Lodash lijkt een drop-in vervanger voor underscore, de laatste is er al langer.
Ik denk dat beide briljant zijn, maar ik weet niet genoeg over hoe ze werken om een gefundeerde vergelijking te maken, en ik zou graag meer willen weten over de verschillen.
Ik heb Lo-Dash gemaakt om meer consistente cross-environment iteratie ondersteuning te bieden voor arrays, strings, objecten, en arguments
objecten1. Het is sindsdien een superset van Underscore geworden, met consistenter API gedrag, meer features (zoals AMD ondersteuning, deep clone, en deep merge), meer grondige documentatie en unit tests (tests die draaien in Node, Ringo, Rhino, Narwhal, PhantomJS, en browsers), betere algehele prestaties en optimalisaties voor grote arrays/object iteratie, en meer flexibiliteit met custom builds en template pre-compilatie hulpprogramma's.
Omdat Lo-Dash vaker wordt bijgewerkt dan Underscore, wordt een lodash underscore
build geleverd om compatibiliteit met de laatste stabiele versie van Underscore te garanderen.
Op een gegeven moment kreeg ik zelfs push toegang tot Underscore, deels omdat Lo-Dash verantwoordelijk is voor het naar voren brengen van meer dan 30 problemen; het landen van bug fixes, nieuwe functies, & perf winst in Underscore v1.4.x+.
Daarnaast zijn er ten minste 3 Backbone boilerplates die standaard Lo-Dash bevatten en wordt Lo-Dash nu genoemd in Backbone's officiële documentatie.
Check Kit Cambridge's post, Say "Hello" to Lo-Dash, voor een diepere uitsplitsing van de verschillen tussen Lo-Dash en Underscore.
Voetnoten:
arguments
objecten. In nieuwere browsers negeren Underscore methoden gaten in arrays, "Objects" methoden itereren arguments
objecten, strings worden behandeld als array-achtige, en methoden itereren correct functies (het negeren van hun "prototype" eigenschap) en objecten (itereren van geschaduwde eigenschappen zoals "toString" en "valueOf"), terwijl ze dat in oudere browsers niet doen. Ook Underscore methodes zoals _.clone
behouden gaten in arrays, terwijl andere zoals _.flatten
dat niet doen'-.Lo-Dash is geïnspireerd door underscore, maar is tegenwoordig een superieure oplossing. Je kunt je aangepaste builds maken, een hogere prestatie hebben, AMD ondersteunen en geweldige extra functies hebben. Bekijk deze Lo-Dash vs Underscore benchmarks op jsperf en... deze geweldige post over lo-dash:
Een van de handigste functies als je met verzamelingen werkt, is de steno syntaxis:
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 }]
(overgenomen uit lodash docs)
In aanvulling op John's antwoord, en het lezen van lodash (die ik tot nu toe had beschouwd als een "me-too" naar underscore), en het zien van de prestatietests, het lezen van de broncode, en blog posts, zijn de paar punten die lodash veel beter maken dan underscore de volgende:
Als je in underscore's source-code kijkt, zul je in de eerste paar regels zien dat underscore terugvalt op de native implementaties van veel functies. Hoewel dit in een ideale wereld een betere aanpak zou zijn geweest, als je kijkt naar een aantal van de perf links gegeven in deze slides, is het niet moeilijk om de conclusie te trekken dat de kwaliteit van die 'native implementaties' veel browser-tot-browser varieert. Firefox is verdomd snel in sommige van de functies, en in sommige domineert Chrome. (Ik kan me voorstellen dat er ook scenario's zijn waarin IE zou domineren). Ik denk dat het beter is om de voorkeur te geven aan een code waarvan de prestaties consistenter zijn tussen browsers.
Lees de blog post eerder, en in plaats van het te geloven voor zijn bestwil, oordeel zelf door het uitvoeren van de benchmarks. Ik ben met stomheid geslagen nu ik lodash 100-150% sneller zie presteren dan underscore in zelfs simpele, native functies zoals
Array.every
in Chrome!
Hier is een lijst van verschillen tussen lodash, en het's underscore-build is een drop-in vervanging voor uw underscore projecten.