Différences entre lodash et underscore
pourquoi quelqu'un préférerait le lodash .js ou trait de soulignement.js bibliothèque utilitaire sur l'autre?
Lodash semble être un remplacement de underscore, ce dernier ayant été autour plus longtemps.
je pense que les deux sont géniaux, mais je ne sais pas assez sur la façon dont ils travaillent pour faire de l'éducation de la comparaison, et je voudrais en savoir plus sur les différences.
11 réponses
j'ai créé Lo-Dash pour fournir un support d'itération plus cohérent pour les tableaux, les chaînes, les objets et arguments
objets 1 . Il est devenu depuis un super-ensemble de Underscore, fournissant un comportement API plus cohérent, plus caractéristiques (comme le soutien AMD, deep clone, et Deep merge), plus approfondie documentation et des tests unitaires( tests qui fonctionnent dans le noeud, Ringo, Rhino, Narwhal, PhantomJS, et navigateurs), de meilleures performances globales et optimisations pour les grands tableaux / itération objet, et plus de flexibilité avec custom builds et les utilitaires de pré-compilation de modèles.
étant donné que Lo-Dash est mis à jour plus fréquemment que Underscore, un lodash underscore
build est fourni pour assurer la compatibilité avec la dernière version stable de Underscore.
à un moment, on m'a même donné push accédez à pour souligner, en partie parce que Lo-Dash est responsable de soulever plus de 30 problèmes; corrections de bugs d'atterrissage, nouvelles fonctionnalités, et gains de perf dans Underscore v1.4.x+.
en outre, il y a au moins 3 plaques de base qui comprennent Lo-Dash par défaut et Lo-Dash est maintenant mentionné dans la documentation officielle de Backbone .
découvrez le Kit de Cambridge post, Dire "Bonjour" à Lo-Dash , pour une analyse plus approfondie des différences entre Lo-Dash et Underscore.
notes:
- trait de Soulignement n'est pas cohérente de soutien pour les tableaux, chaînes de caractères, des objets, et
arguments
des objets. Dans les navigateurs plus récents, les méthodes de soulignement ignorer trous dans les tableaux ," les objets "méthodes itèrentarguments
objets, les chaînes sont traitées comme des tableaux-like, et les méthodes correctement itérer les fonctions (ignorant leur prototype "" propriété) et des objets (itération de propriétés ombragées comme "toString" et "valueOf"), alors que dans les navigateurs plus anciens, ils ne le seront pas. En outre, les méthodes de soulignement comme_.clone
préservent les trous dans les tableaux, tandis que d'autres comme_.flatten
ne le font pas.
Lo-Dash est inspiré de underscore, mais de nos jours est une solution supérieure. Vous pouvez faire votre construit sur mesure , avoir un plus haute performance , soutenir AMD et avoir grandes fonctionnalités supplémentaires . Cochez cette case Lo-Dash vs Underscore benchmarks sur jsperf et.. ce impressionnant post sur lo-dash :
une des fonctionnalités les plus utiles lorsque vous travaillez avec 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 }]
(tiré de lodash docs )
en plus de la réponse de John, et la lecture sur lodash (que j'avais jusque-là considéré comme un "moi-trop" à souligner), et de voir les tests de performance, la lecture du code source, et blog posts , les quelques points qui font lodash beaucoup plus supérieur à souligner sont ceux-ci:
-
il ne s'agit pas de la vitesse, car il s'agit de cohérence de la vitesse (?)
si vous regardez dans le code source de underscore, vous verrez dans les premières lignes que underscore falls-back 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 perf liens donnés dans ces diapositives , il n'est pas difficile de tirer la conclusion que la qualité de ces "indigènes implémentations' varier d'un navigateur à navigateur. Firefox est sacrément rapide à certaines fonctions, et dans certains Chrome domine. (J'imagine qu'il y aurait certains scénarios où IE dominerait aussi). Je crois qu'il est préférable de préférer un code dont la performance est plus cohérente entre les navigateurs.
lisez le billet de blog plus tôt, et au lieu de le croire pour son bien, jugez par vous-même en lançant le benchmarks . Je suis stupéfait en ce moment, voir un lodash performer 100-150% plus vite que underscore dans même simple , natif fonctions telles que
Array.every
en Chrome! -
les extras dans lodash sont également très utiles.
- comme pour le commentaire très en vogue de Xananax suggérant une contribution au code de underscore: il est toujours préférable d'avoir bon concurrence, non seulement il maintient l'innovation en marche, mais il vous pousse également à garder vous-même (ou votre bibliothèque) en bonne forme.
Voici une liste des différences entre lodash, et c'est underscore-build est un remplacement direct pour vos projets de underscore.
si comme moi vous vous attendiez liste des différences d'utilisation entre underscore et lodash, Il ya un guide pour la migration de underscore à lodash .
Voici l'état actuel pour la postérité:
- trait de Soulignement
_.compose
est Lodash_.flowRight
- trait de Soulignement
_.contains
est Lodash_.includes
- trait de Soulignement
_.findWhere
est Lodash_.find
- trait de Soulignement
_.invoke
est Lodash_.invokeMap
- trait de Soulignement
_.mapObject
est Lodash_.mapValues
- trait de Soulignement
_.pluck
est Lodash_.map
- trait de Soulignement
_.where
est Lodash_.filter
- trait de Soulignement
_.any
est Lodash_.some
- trait de Soulignement
_.all
est Lodash_.every
- trait de Soulignement
_.each
ne permet pas de quitter en retourfalse
- trait de Soulignement
_.flatten
est profonde par défaut lors de la Lodash est peu profonde- trait de Soulignement
_.isFinite
ne s'aligne pas avecNumber.isFinite
(par exemple,_.isFinite('1')
renvoietrue
trait de Soulignement, maisfalse
Lodash)- trait de Soulignement
_.matches
abréviation ne prend pas en charge profonde comparaisons
(par exemple_.filter(objects, { 'a': { 'b': 'c' } })
)- Underscore ≥ 1.7 & Lodash ont changé leur syntaxe
_.template
en
_.template(string, option)(data)
- Lodash
_.uniq
n'accepte pas une fonctioniteratee
comme celle de Underscore. Uselodas_.uniqBy
- Lodash
_.first
et._last
n'acceptent pas un argumentn
comme De Underscore. Useslice
- Lodash
_.memoize
caches sontMap
comme des objets- supports Lodash chaînage implicite , chaînage paresseux, & raccourci fusion
- Lodash a fendu sa surcharge
_.head
,_.last
,_.rest
, &_.initial
vers
_.take
,_.takeRight
,_.drop
, &_.dropRight
(i.e._.head(array, 2)
en Underscore est_.take(array, 2)
dans Lodash)
nous sommes en 2014 et quelques années trop tard. Pourtant, je pense que mon point tient:
IMHO cette discussion est devenue un peu démesurée. Citant ce qui précède post de blog :
la plupart des bibliothèques utilitaires JavaScript, telles que Underscore, Valentine, et wu, s'appuyer sur la "native-première double approche."Cette approche préfère les implémentations natives, retombant à JavaScript à la vanille seulement si le l'équivalent natif n'est pas supporté. Mais jsPerf a révélé un intéressant tendance: la façon la plus efficace d'itérer sur un tableau ou un type de tableau collection est d'éviter les implémentations natives entièrement, en optant pour des boucles simples à la place.
comme si" simple loops "et" vanilla Javascript " étaient plus natifs que les implémentations de méthodes de tableaux ou D'objets. Jeez ...
ce serait certainement bien d'avoir une seule source de vérité, mais là Non. Même si on vous a dit le contraire, il n'y a pas de Dieu vanille, ma chère. Je suis désolé. La seule hypothèse qui tient vraiment est que nous sommes tous en train d'écrire du code Javascript qui vise à bien fonctionner dans tous les principaux navigateurs, sachant que tous ont des implémentations différentes des mêmes choses. C'est une chienne à gérer, pour le dire avec modestie. Mais c'est la prémisse, que ça te plaise ou non.
peut-être que vous travaillez tous sur des projets à grande échelle qui ont besoin de twitterish performance de sorte que vous voyez vraiment la différence entre 850.000 (underscore) vs. 2.500.000 (lodash) itérations sur une liste par sec en ce moment!
Je ne le suis pas. Je veux dire, j'ai travaillé sur des projets où j'ai dû aborder des problèmes de performance, mais ils n'ont jamais été résolus ou causés par ni Underscore ni Lo-Dash. Et à moins que je ne m'empare des différences réelles dans l'implémentation et la performance (on parle de C++ en ce moment) de disons une boucle sur un itérable (objet ou un tableau, peu ou pas!), Je préfère ne pas m'ennuyer avec des revendications basées sur les résultats d'une plate-forme de référence que est déjà opinioné .
il n'a besoin que d'une seule mise à jour de disons Rhino pour mettre le feu à ses implémentations de la méthode Array d'une manière que pas un seul "Medieval loop methods perform better and forever and whatnot" prêtre peut argumenter son chemin autour du simple fait que tout d'un soudain array methods in FF sont beaucoup plus rapides que son opinionated brainfuck. Mec, tu ne peux pas tromper ton environnement runtime en trompant ton environnement runtime! Pensez à cela lors de la promotion ...
votre ceinture utilitaire
... la prochaine fois.
Afin de garder pertinent:
- utilisez le soulignement si vous êtes dans la commodité sans sacrifier l'ish autochtone.
- Use Lo-Dash si vous aimez la commodité et aimez son catalogue de fonctionnalités étendues (copie profonde, etc.) et si vous avez un besoin désespéré de performances instantanées et surtout, ne vous gênez pas pour trouver une alternative dès que les solutions de workaurounds de l'API native seront surpassées en Opinions. Qui va bientôt arriver. Période.
- il y a même une troisième solution. DIY! Connaissez vos environnements. Connaître les incohérences. Lire leur ( John-David 's et Jeremy ' s) code. Ne pas utiliser ceci ou cela sans être en mesure d'expliquer pourquoi une couche de cohérence/compatibilité est vraiment nécessaire et améliore votre flux de travail ou améliore les performances de votre application. Il est très probable que vos exigences sont remplies avec un simple polyfill que vous êtes parfaitement capable d'écrire vous-même. Les deux bibliothèques sont simplement vanille simple avec un peu de sucre. ils se disputent juste pour savoir qui sert la tarte la plus sucrée . Mais croyez-moi, dans le fin les deux ne font que cuire avec de l'eau. Il n'y a pas de Dieu vanille donc il ne peut pas y avoir de Pape vanille, non?
choisissez l'approche qui convient le mieux à vos besoins. Comme à l'habitude. Je préférerais des retombées sur des implémentations réelles plutôt que des fraudes opiniâtres, mais même ça semble être une question de goût de nos jours. S'en tenir à des ressources de qualité comme http://developer.mozilla.com et http://caniuse.com et vous serez l'amende juste.
je suis d'accord avec la plupart des choses dites ici, mais je veux juste souligner un argument en faveur de underscore.js: la taille de la bibliothèque.
spécialement dans le cas où vous développez une application ou un site web qui a l'intention d'être utilisé principalement sur les appareils mobiles, la taille du faisceau résultant et l'effet sur le temps de démarrage ou de téléchargement peuvent avoir un rôle important.
pour comparaison, ces tailles sont celles que j'ai remarquées avec source-map-explorer après l'exécution ionique servir:
lodash: 523kB
underscore.js: 51.6kb
pas sûr que ce soit ce que OP voulait dire, mais je suis venu à travers cette question parce que je cherchais une liste de problèmes que je dois garder à l'esprit lors de la migration de underscore à lodash.
j'apprécierais vraiment si quelqu'un publiait un article avec une liste complète de telles différences. Permettez-moi de commencer par les choses que j'ai apprises à la dure (c'est-à-dire les choses qui ont fait exploser mon code lors de la production:/) :
-
_.flatten
underscore est profond par défaut et vous devez passer true comme second argument pour le rendre superficiel. Dans lodash il est superficiel par défaut et passer true comme second argument le rendra profond! :) -
_.last
dans underscore accepte un second argument qui indique combien d'éléments vous voulez. Danslodash
il n'y a pas une telle option. Vous pouvez l'imiter avec.slice
-
_.first
(même numéro) -
_.template
le soulignement peut être utilisé de nombreuses façons, dont l'une est de fournir la chaîne de caractères et les données du modèle et de récupérerHTML
(ou du moins c'est comme ça que ça a fonctionné il y a quelque temps). Danslodash
vous recevez une fonction que vous devez nourrir avec les données. -
_(something).map(foo)
fonctionne en underscore, mais en lodash j'ai dû le réécrire à_.map(something,foo)
. Peut-être que c'était juste unTypeScript
problème
http://benmccormick.org/2014/11/12/underscore-vs-lodash/
dernier article comparant les deux par Ben McCormick:
L'API de Lo-Dash est un super-jeu de Underscore.
sous le capot [Lo-Dash] a été entièrement réécrit.
Lo-Dash n'est certainement pas plus lent que Souligner.
Qu'a ajouté Lo-Dash?
- Améliorations
- Fonctionnalité Supplémentaire
- Gains De Performance
- syntaxes abrégées pour chaînage
- constructions sur mesure pour n'utiliser que ce dont vous avez besoin
- versioning sémantique et couverture de code à 100%
je viens de trouver une différence qui a fini par être important pour moi. La version non-compatible avec les soulignements de lodash _.extend()
fait et non copie sur les propriétés ou les méthodes définies au niveau de la classe.
j'ai créé un test de Jasmine en Coffee-script qui démontre ceci:
https://gist.github.com/softcraft-development/1c3964402b099893bd61
heureusement, lodash.underscore.js
préserve le comportement de Underscore de tout copier, qui pour ma situation était le comportement désiré.
lodash a obtenu _.mapValues()
qui est identique à underescore _.mapObject()
.
pour la plupart des underscore est un sous-ensemble de lodash. Parfois, comme actuellement, underscore aura de jolies petites fonctions que lodash n'a pas comme mapObject. Ce un m'a sauvé beaucoup de temps dans le développement de mon projet.