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.

1420
demandé sur Cœur 2012-12-09 21:08:36

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:

  1. 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èrent arguments 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.
1812
répondu John-David Dalton 2018-08-30 07:29:15

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 )

168
répondu neiker 2015-04-29 18:23:46

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:

  1. 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!

  2. les extras dans lodash sont également très utiles.

  3. 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.

58
répondu kumar_harsh 2015-01-07 08:43:18

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 retour false
  • trait de Soulignement _.flatten est profonde par défaut lors de la Lodash est peu profonde
  • trait de Soulignement _.isFinite ne s'aligne pas avec Number.isFinite

    (par exemple, _.isFinite('1') renvoie true trait de Soulignement, mais false 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 fonction iteratee comme celle de Underscore. Uselodas _.uniqBy
  • Lodash _.first et ._last n'acceptent pas un argument n comme De Underscore. Use slice
  • Lodash _.memoize caches sont Map 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)
57
répondu Iest 2016-07-21 09:35:51

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.

43
répondu Lukas Bünger 2014-09-12 00:14:38

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
15
répondu David Dal Busco 2017-04-26 14:20:40

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. Dans lodash 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érer HTML (ou du moins c'est comme ça que ça a fonctionné il y a quelque temps). Dans lodash 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 un TypeScript problème
10
répondu qbolec 2017-02-24 13:46:50

http://benmccormick.org/2014/11/12/underscore-vs-lodash/

dernier article comparant les deux par Ben McCormick:

  1. L'API de Lo-Dash est un super-jeu de Underscore.

  2. sous le capot [Lo-Dash] a été entièrement réécrit.

  3. Lo-Dash n'est certainement pas plus lent que Souligner.

  4. 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%
8
répondu pilau 2014-12-07 14:23:41

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é.

6
répondu Craig Walker 2014-12-12 16:56:40

lodash a obtenu _.mapValues() qui est identique à underescore _.mapObject() .

3
répondu artknight 2017-02-24 14:50:16

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.

0
répondu rashadb 2015-05-14 11:16:42