Pourquoi préférerait-on la bibliothèque utilitaire [lodash.js][1] ou [underscore.js][2] à l'autre ?
Lodash semble être un remplacement immédiat d'underscore, ce dernier existant depuis plus longtemps.
Je pense que les deux sont brillants, mais je n'en sais pas assez sur leur fonctionnement pour faire une comparaison éclairée, et j'aimerais en savoir plus sur les différences.
[1] : http://lodash.com/ [2] : http://underscorejs.org/
J'ai créé Lo-Dash pour fournir un support plus cohérent de l'itération inter-environnementale pour les tableaux, les chaînes de caractères, les objets et les objets arguments
1. Il est depuis devenu un sur-ensemble d'Underscore, offrant un comportement plus cohérent de l'API, plus de [fonctionnalités][2] (comme le support AMD, le clone profond et la fusion profonde), une [documentation][3] et des tests unitaires plus complets (tests qui s'exécutent dans Node, Ringo, Rhino, Narwhal, PhantomJS et les navigateurs), de meilleures performances globales et des optimisations pour l'itération de grands tableaux/objets, et plus de flexibilité avec des [constructions personnalisées][4] et des utilitaires de précompilation de modèles.
Lo-Dash étant mis à jour plus fréquemment qu'Underscore, un build lodash underscore
[est fourni][5] pour assurer la compatibilité avec la dernière version stable d'Underscore.
À un moment donné, on m'a même donné un [accès push][6] à Underscore, en partie parce que Lo-Dash est responsable de la résolution de plus de 30 problèmes, de la correction de bogues, de l'ajout de nouvelles fonctionnalités et de l'amélioration des performances dans Underscore v1.4.x+.
En outre, au moins trois modèles de Backbone incluent Lo-Dash par défaut et Lo-Dash est désormais mentionné dans la [documentation] officielle de Backbone [7].
Consultez l'article de Kit Cambridge, [Say "Hello" to Lo-Dash][1], pour une analyse plus approfondie des différences entre Lo-Dash et Underscore.
Notes de bas de page :
arguments
. Dans les navigateurs récents, les méthodes Underscore ignorent [les trous dans les tableaux][8], les méthodes "Objects" itèrent les objets arguments
, les chaînes de caractères sont traitées comme des tableaux, et les méthodes itèrent correctement les fonctions (en ignorant leur propriété "prototype") et les objets (en itérant les propriétés ombrées comme "toString" et "valueOf"), alors que dans les navigateurs plus anciens, elles ne le font pas. De plus, les méthodes Underscore comme _.clone
préservent les trous dans les tableaux, alors que d'autres comme _.flatten
ne le font pas.[1] : https://web.archive.org/web/20180101093627/http://kitcambridge.be/blog/say-hello-to-lo-dash/ [2] : http://lodash.com [3] : http://lodash.com/docs [4] : http://lodash.com/ [5] : http://lodash.com/ [6] : https://s3.amazonaws.com/f.cl.ly/items/2e0O0S010f2A3s1W283U/push_access.png?v=ba693725 [7] : http://backbonejs.org/#downloads [8] : http://www.2ality.com/2012/06/dense-arrays.html
Lo-Dash s'inspire de underscore, mais est aujourd'hui une solution supérieure. Vous pouvez faire vos [constructions personnalisées][1], avoir une [meilleure performance][2], supporter AMD et avoir [de superbes fonctionnalités supplémentaires][3]. Regardez ce [benchmarks Lo-Dash vs Underscore][4] sur jsperf et... ce [post génial sur lo-dash][5] :
L'une des fonctions les plus utiles lorsque vous travaillez avec des collections est la syntaxe abrégée :
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 }]
(extrait de [lodash docs][6])
[1] : http://lodash.com/custom-builds [2] : http://lodash.com/benchmarks [3] : http://lodash.com/#features [4] : http://jsperf.com/lodash-underscore [5] : http://kitcambridge.be/blog/say-hello-to-lo-dash/ [6] : http://lodash.com/docs#filter
En plus de la réponse de John, de la lecture de lodash (que j'avais jusqu'à présent considéré comme un "me-too" d'underscore), des tests de performance, de la lecture du code source et des [articles de blog] (http://kitcambridge.be/blog/say-hello-to-lo-dash/), les quelques points qui rendent lodash bien supérieur à underscore sont les suivants :
Si vous regardez le code source d'underscore, vous verrez dans les premières lignes qu'underscore se rabat sur les implémentations natives de nombreuses fonctions. Bien que dans un monde idéal, cela aurait été une meilleure approche, si vous regardez certains des liens de perforation donnés dans [ces diapositives] (http://allyoucanleet.com/post/21624742336/jsconf-us-12-slides), il n'est pas difficile de tirer la conclusion que la qualité de ces "implémentations natives" varie beaucoup d'un navigateur à l'autre. Firefox est sacrément rapide dans certaines fonctions, et dans d'autres Chrome domine. (J'imagine qu'il y aurait des scénarios où IE dominerait aussi). Je pense qu'il est préférable de préférer un code dont les performances sont plus cohérentes d'un navigateur à l'autre.
Lisez l'article de blog plus haut, et au lieu de le croire pour l'amour du ciel, jugez par vous-même en exécutant les [benchmarks] (http://lodash.com/benchmarks). Je suis stupéfait de voir que lodash est 100-150% plus rapide que underscore, même dans des fonctions simples et natives comme
Array.every
dans Chrome !
Voici une liste des différences entre lodash, et underscore-build est un remplacement direct pour vos projets underscore.