Pourquoi quelqu'un préférerait-il la bibliothèque d'utilitaires lodash.js ou underscore.js à l'autre?
Lodash semble être un remplaçant pour le soulignement, ce dernier ayant été plus longtemps.
Je pense que les deux sont brillants, mais je ne sais pas assez comment ils fonctionnent pour faire une comparaison instruite, et j'aimerais en savoir plus sur les différences.
underscore.js
javascript
lodash
Brian M. Hunt
la source
la source
lodash
etunderscore
sont en cours de fusion maintenantRéponses:
J'ai créé Lo-Dash pour fournir un support d'itération inter-environnements plus cohérent pour les tableaux, les chaînes, les objets et les
arguments
objets 1 . Il est depuis devenu un surensemble de Underscore, offrant un comportement d'API plus cohérent, plus de fonctionnalités (comme le support AMD, le clone profond et la fusion profonde), une documentation plus approfondie et des tests unitaires (tests qui s'exécutent dans Node, Ringo, Rhino, Narwhal, PhantomJS et navigateurs), de meilleures performances globales et optimisations pour les grands tableaux / itérations d'objets, et plus de flexibilité avec les builds personnalisés et les utilitaires de pré-compilation de modèles.Étant donné que Lo-Dash est mis à jour plus fréquemment que Underscore, une
lodash underscore
version est fournie pour garantir la compatibilité avec la dernière version stable d'Underscore.À un moment donné, on m'a même donné un accès push à Underscore, en partie parce que Lo-Dash est responsable de soulever plus de 30 problèmes; corrections de bogues d'atterrissage, nouvelles fonctionnalités et gains de performances dans Underscore v1.4.x +.
De plus, il existe au moins 3 plaques chauffantes Backbone qui incluent Lo-Dash par défaut et Lo-Dash est maintenant mentionné dans la documentation officielle de Backbone .
Consultez la publication de Kit Cambridge, dites «Bonjour» à Lo-Dash , pour une ventilation plus approfondie des différences entre Lo-Dash et Underscore.
Notes de bas de page:
arguments
objets. Dans les navigateurs plus récents, les méthodes Underscore ignorent les trous dans les tableaux , les méthodes "Objects" itèrent lesarguments
objets, les chaînes sont traitées comme des tableaux et les méthodes itèrent correctement les fonctions (ignorant leur propriété "prototype") et les objets (itérant les propriétés ombrées comme "toString" et "valueOf"), contrairement aux anciens navigateurs. En outre, les méthodes de soulignement comme la_.clone
préservation des trous dans les tableaux, tandis que d'autres_.flatten
n'aiment pas.la source
Lo-Dash est inspiré par le soulignement, mais est aujourd'hui une solution supérieure. Vous pouvez créer vos versions personnalisées , avoir des performances supérieures , prendre en charge AMD et disposer de fonctionnalités supplémentaires intéressantes . Consultez ce benchmark Lo-Dash vs Underscore sur jsperf et .. ce post génial sur lo-dash :
L'une des fonctionnalités les plus utiles lorsque vous travaillez avec des collections est la syntaxe abrégée:
(extrait des documents lodash )
la source
filter
vedette dans le soulignement de 2012 github.com/jashkenas/underscore/issues/648 (son nom estwhere
)Si, comme moi, vous vous attendiez à une liste des différences d'utilisation entre le trait de soulignement et le lodash, il existe un guide pour la migration du trait de soulignement au lodash .
Voici son état actuel pour la postérité:
la source
En plus de la réponse de John, et en lisant sur lodash (que j'avais jusque-là considéré comme un "moi-aussi" pour souligner), et en voyant les tests de performance, en lisant le code source et les articles de blog , les quelques points qui font lodash sont bien supérieurs à souligner:
Il ne s'agit pas de la vitesse, car il s'agit de la cohérence de la vitesse (?)
Les extras dans lodash sont également très utiles.
Voici une liste des différences entre lodash, et sa construction de soulignement est un remplacement direct pour vos projets de soulignement.
la source
Nous sommes en 2014 et quelques années trop tard. Je pense toujours que mon argument est valable:
À mon humble avis, cette discussion a été assez disproportionnée. Citant le billet de blog susmentionné :
Comme si les "boucles simples" et le "vanilla Javascript" étaient plus natifs que les implémentations de méthodes Array ou Object. Bon sang ...
Ce serait certainement bien d'avoir une seule source de vérité, mais il n'y en a pas. 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 écrivons tous 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 moins. Mais c'est la prémisse, que cela vous plaise ou non.
Peut-être que vous travaillez tous sur des projets à grande échelle qui nécessitent des performances Twitterish afin que vous puissiez vraiment voir la différence entre 850 000 (soulignement) et 2 500 000 (lodash) itérations sur une liste par seconde en ce moment!
Pour ma part, je ne le suis pas. Je veux dire, j'ai travaillé sur des projets où je devais résoudre des problèmes de performances, mais ils n'ont jamais été résolus ou causés par ni Underscore ni Lo-Dash. Et à moins que je ne comprenne les vraies différences d'implémentation et de performances (nous parlons en ce moment de C ++) de disons une boucle sur un itérable (objet ou tableau, clairsemé ou non!), Je ne me soucie pas du tout des revendications basées sur les résultats d'une plateforme de référence déjà jugée .
Il n'a besoin que d'une seule mise à jour de, disons Rhino, pour mettre le feu à ses implémentations de méthode Array d'une manière qu'aucun prêtre "des méthodes de boucle médiévales ne fonctionne mieux et pour toujours et ainsi de suite". une méthode de tableau soudaine dans FF est beaucoup plus rapide que son brainfuck opiniâtre. Man, vous ne pouvez tout simplement pas tromper votre environnement d'exécution en trichant votre environnement d'exécution! Pensez-y lorsque vous faites la promotion ...
... la prochaine fois.
Donc, pour rester pertinent:
Choisissez l'approche qui correspond le mieux à vos besoins. Comme d'habitude. Je préfère les solutions de repli sur les implémentations réelles aux tricheurs d'exécution d'opinion à tout moment, mais même cela semble être une question de goût de nos jours. Restez fidèle à des ressources de qualité comme http://developer.mozilla.com et http://caniuse.com et tout ira bien.
la source
Array.from
ils ne sauraient probablement même pas ce que cela est censé faire. Les gens de la «ceinture utilitaire» JS semblent tellement préoccupés par la promotion de leurs solutions de contournement si géniales qu'ils ont tendance à oublier qu'en agissant ainsi, ils diluent en fait le processus de normalisation. Aucun besoin de fonctionnalités n'entraîne de pression sur les "fabricants" de navigateurs. Fait amusant: 2 des 4 principaux navigateurs sont basés sur des projets open source ( 1 , 2 ).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.
Surtout dans le cas où vous développez une application ou un site Web destiné à être utilisé principalement sur des appareils mobiles, la taille du bundle résultant et l'effet sur le démarrage ou le temps de téléchargement peuvent avoir un rôle important.
À titre de comparaison, ces tailles sont celles que j'ai remarquées avec source-map-explorer après avoir exécuté le service ionique:
édité en février 2020 :
on peut utiliser BundlePhobia pour vérifier la taille actuelle de Lo-Dash et Underscore
la source
source-map-explorer after running ionic serve
Je ne sais pas si c'est ce que OP voulait dire, mais je suis tombé sur cette question parce que je cherchais une liste de problèmes que je dois garder à l'esprit lors de la migration du trait de soulignement vers lodash.
J'apprécierais vraiment que quelqu'un publie un article avec une liste complète de ces 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 en production: /):
_.flatten
dans le soulignement est profond par défaut et vous devez passer true comme deuxième argument pour le rendre superficiel. Dans lodash, il est peu profond par défaut et passe vrai car le deuxième argument le rendra profond! :)_.last
en trait de soulignement accepte un deuxième argument qui indique combien d'éléments vous voulez. Illodash
n'y a pas une telle option. Vous pouvez imiter cela avec.slice
_.first
(même problème)_.template
dans le trait de soulignement peut être utilisé de plusieurs façons, dont l'une fournit la chaîne et les données du modèle etHTML
récupère (ou du moins c'est ainsi que cela fonctionnait il y a quelque temps). Enlodash
vous recevez une fonction que vous devriez alors alimenter avec les données._(something).map(foo)
fonctionne en soulignement, mais en lodash j'ai dû le réécrire_.map(something,foo)
. C'était peut-être juste unTypeScript
problèmela source
_(something).map(foo).value()
.http://benmccormick.org/2014/11/12/underscore-vs-lodash/
Dernier article comparant les deux de Ben McCormick:
la source
Je viens de découvrir une différence qui a fini par être importante pour moi. La version non compatible avec le soulignement de lodash
_.extend()
ne copie pas les propriétés ou méthodes définies au niveau de la classe.J'ai créé un test Jasmine dans CoffeeScript qui le démontre:
https://gist.github.com/softcraft-development/1c3964402b099893bd61
Heureusement,
lodash.underscore.js
préserve le comportement d'Underscore de tout copier, ce qui, pour ma situation, était le comportement souhaité.la source
lodash a obtenu
_.mapValues()
qui est identique à underescore_.mapObject()
.la source
Pour la plupart, le soulignement est un sous-ensemble de lodash. Parfois, comme actuellement le soulignement aura de petites fonctions sympas que lodash n'a pas comme mapObject. Celui-ci m'a fait gagner beaucoup de temps dans le développement de mon projet.
la source
Ils sont assez similaires, avec Lodash prend le relais ...
Ils sont tous deux une bibliothèque d'utilitaires qui prend le monde de l'utilité en JavaScript ...
Il semble que Lodash soit mis à jour plus régulièrement maintenant, donc plus utilisé dans les derniers projets ...
Aussi Lodash semble est plus léger par un couple de KBS ...
Les deux ont une bonne api et doc, mais je pense que Lodash est meilleur ...
Voici une capture d'écran pour chacun des documents pour obtenir la première valeur d'un tableau ...
souligner:
lodash:
Comme les choses peuvent être mises à jour de temps en temps, il suffit de consulter leur site Web également ...
lodash
souligner
la source