Diferencias entre Lodash y Underscore.js [cerrado]
¿ Por qué alguien preferiría la biblioteca de utilidades Lodash o Underscore.js sobre la otra?
Lodash parece ser un sustituto directo del guión bajo, ya que este último existe desde hace más tiempo.
Creo que ambos son brillantes, pero no sé lo suficiente sobre cómo funcionan para hacer una comparación fundamentada y me gustaría saber más sobre las diferencias.
Creé Lodash para proporcionar un soporte de iteración entre entornos más consistente para matrices, cadenas, objetos y arguments
objetos 1 . Desde entonces, se ha convertido en un superconjunto de Underscore.js, que proporciona un comportamiento de API más consistente, más funciones (como compatibilidad con AMD, clonación profunda y fusión profunda), documentación más exhaustiva y pruebas unitarias (pruebas que se ejecutan en Node.js , RingoJS , Rhino) . , Narwhal , PhantomJS y navegadores), mejor rendimiento general y optimizaciones para grandes matrices/iteración de objetos, y más flexibilidad con compilaciones personalizadas y utilidades de precompilación de plantillas.
Debido a que Lodash se actualiza con más frecuencia que Underscore.js, se proporcionalodash underscore
una compilación para garantizar la compatibilidad con la última versión estable de Underscore.js.
En un momento, incluso me dieron acceso push a Underscore.js, en parte porque Lodash es responsable de plantear más de 30 problemas; Correcciones de errores de aterrizaje, nuevas funciones y mejoras de rendimiento en Underscore.js v1.4.x+.
Además, hay al menos tres textos estándar de Backbone.js que incluyen Lodash de forma predeterminada y Lodash ahora se menciona en la documentación oficial de Backbone.js .
Consulte la publicación de Kit Cambridge, Di "Hola" a Lo-Dash , para obtener un desglose más profundo de las diferencias entre Lodash y Underscore.js.
Notas a pie de página:
- Underscore.js tiene soporte inconsistente para matrices, cadenas, objetos y
arguments
objetos. En los navegadores más nuevos, los métodos Underscore.js ignoran los agujeros en las matrices , los métodos "Objetos" iteranarguments
objetos, las cadenas se tratan como si fueran matrices y los métodos iteran correctamente funciones (ignorando su propiedad "prototipo") y objetos (iterando propiedades sombreadas como "toString"). " y "valueOf"), mientras que en navegadores más antiguos no lo harán. Además, los métodos de Underscore.js, como_.clone
, conservan los agujeros en las matrices, mientras que otros_.flatten
no lo hacen.
Lodash está inspirado en Underscore.js, pero hoy en día es una solución superior. Puede crear compilaciones personalizadas , tener un mayor rendimiento , ser compatible con AMD y tener excelentes funciones adicionales . Consulte estos puntos de referencia de Lodash vs. Underscore.js en jsperf y... esta increíble publicación sobre Lodash :
Una de las características más útiles cuando trabajas con colecciones es la sintaxis abreviada:
(aunque Underscore ahora también admite esta sintaxis)
var characters = [
{ 'name': 'barney', 'age': 36, 'blocked': false },
{ 'name': 'fred', 'age': 40, 'blocked': true }
];
// Using "_.filter" callback shorthand
_.filter(characters, { 'age': 36 });
// Using Underscore.js
_.filter(characters, character => character.age === 36);
// → [{ 'name': 'barney', 'age': 36, 'blocked': false }]
(tomado de la documentación de Lodash )
Si, como yo, esperaba una lista de diferencias de uso entre Underscore.js y Lodash, existe una guía para migrar de Underscore.js a Lodash .
Aquí está el estado actual para la posteridad:
- El guión bajo
_.any
es Lodash_.some
- El guión bajo
_.all
es Lodash_.every
- El guión bajo
_.compose
es Lodash_.flowRight
- El guión bajo
_.contains
es Lodash_.includes
- El guión bajo
_.each
no permite salir regresandofalse
- El guión bajo
_.findWhere
es Lodash_.find
- El guión bajo
_.flatten
es profundo de forma predeterminada, mientras que Lodash es superficial- El guión bajo
_.groupBy
admite un iterado al que se le pasan los parámetros(value, index, originalArray)
, mientras que en Lodash, al iterado_.groupBy
solo se le pasa un único parámetro(value)
:.- Underscore.js
_.indexOf
con el tercer parámetroundefined
es Lodash_.indexOf
- Underscore.js
_.indexOf
con el tercer parámetrotrue
es Lodash_.sortedIndexOf
- El guión bajo
_.indexBy
es Lodash_.keyBy
- El guión bajo
_.invoke
es Lodash_.invokeMap
- El guión bajo
_.mapObject
es Lodash_.mapValues
- El guión bajo
_.max
combina Lodash_.max
y_.maxBy
- El guión bajo
_.min
combina Lodash_.min
y_.minBy
- El guión bajo
_.sample
combina Lodash_.sample
y_.sampleSize
- El guión bajo
_.object
combina Lodash_.fromPairs
y_.zipObject
- El guión bajo
_.omit
de un predicado es Lodash._.omitBy
- El guión bajo
_.pairs
es Lodash_.toPairs
- El guión bajo
_.pick
de un predicado es Lodash._.pickBy
- El guión bajo
_.pluck
es Lodash_.map
- El guión bajo
_.sortedIndex
combina Lodash_.sortedIndex
y_.sortedIndexOf
- Subrayado
_.uniq
por aniteratee
is Lodash_.uniqBy
- El guión bajo
_.where
es Lodash_.filter
- El guión bajo
_.isFinite
no se alineaNumber.isFinite
(por ejemplo,_.isFinite('1')
regresatrue
en Underscore.js, perofalse
en Lodash)- La taquigrafía de subrayado
_.matches
no admite comparaciones profundas
(p. ej.,_.filter(objects, { 'a': { 'b': 'c' } })
)- Subrayado ≥ 1,7 y
_.template
la sintaxis de Lodash es_.template(string, option)(data)
- Los cachés de Lodash
_.memoize
sonMap
como objetos- Lodash no apoya un
context
argumento para muchos métodos a favor de_.bind
- Lodash admite encadenamiento implícito , encadenamiento diferido y fusión de atajos
- Lodash dividió su
_.head
,_.last
,_.rest
, &_.initial
sobrecargado en
_.take
,_.takeRight
,_.drop
, &_.dropRight
(es decir,_.head(array, 2)
en Underscore.js está_.take(array, 2)
en Lodash)
Además de la respuesta de John , y de leer sobre Lodash (que hasta ahora había considerado como un "yo también" para Underscore.js), y de ver las pruebas de rendimiento, leer el código fuente y las publicaciones del blog , los pocos puntos que Lodash es muy superior a Underscore.js son estos:
- No se trata de la velocidad, sino de la consistencia de la velocidad (?)
Si observa el código fuente de Underscore.js, verá en las primeras líneas que Underscore.js recurre a las implementaciones nativas de muchas funciones. Aunque en un mundo ideal, este habría sido un mejor enfoque, si observa algunos de los enlaces de rendimiento que aparecen en estas diapositivas , no es difícil llegar a la conclusión de que la calidad de esas "implementaciones nativas" varía mucho en el navegador. al navegador. Firefox es muy rápido en algunas de las funciones y en algunas domina Chrome. (Me imagino que habría algunos escenarios en los que Internet Explorer también dominaría). Creo que es mejor preferir un código cuyo rendimiento sea más consistente en todos los navegadores.
Lea la publicación del blog anteriormente y, en lugar de creerlo porque sí, juzgue usted mismo ejecutando los puntos de referencia . Estoy atónito en este momento al ver que Lodash funciona entre un 100 y un 150 % más rápido que Underscore.js incluso en funciones nativas simples , como en Chrome.
Array.every
- Los extras de Lodash también son bastante útiles.
- En cuanto al comentario altamente votado de Xananax que sugiere una contribución al código de Underscore.js: Siempre es mejor tener BUENA competencia, no solo mantiene la innovación, sino que también te impulsa a mantenerte a ti mismo (o a tu biblioteca) en buena forma.
Aquí hay una lista de diferencias entre Lodash, y su compilación Underscore.js es un reemplazo directo para sus proyectos Underscore.js.
En 2014 sigo pensando que mi punto es válido:
En mi humilde opinión, esta discusión se desproporcionó bastante. Citando la publicación del blog antes mencionada :
La mayoría de las bibliotecas de utilidades de JavaScript, como Underscore, Valentine y wu, se basan en el "enfoque dual nativo primero". Este enfoque prefiere implementaciones nativas y recurre a JavaScript básico solo si no se admite el equivalente nativo. Pero jsPerf reveló una tendencia interesante: la forma más eficiente de iterar sobre una matriz o una colección similar a una matriz es evitar por completo las implementaciones nativas y optar por bucles simples.
Como si los "bucles simples" y el "Javascript básico" fueran más nativos que las implementaciones de métodos de matriz u objeto. Dios...
Ciertamente sería bueno tener una única fuente de verdad, pero no la hay. Incluso si te han dicho lo contrario, no existe el Dios vainilla, querida. Lo lamento. La única suposición que realmente se cumple es que todos escribimos código JavaScript cuyo objetivo es funcionar bien en los principales navegadores, sabiendo que todos ellos tienen diferentes implementaciones de las mismas cosas. Es difícil afrontarlo, por decirlo suavemente. Pero esa es la premisa, te guste o no.
¡Quizás todos ustedes estén trabajando en proyectos a gran escala que necesitan un rendimiento similar al de Twitter para que realmente puedan ver la diferencia entre 850.000 (Underscore.js) y 2.500.000 (Lodash) iteraciones en una lista por segundo ahora mismo!
Por mi parte, no lo soy. Quiero decir, trabajé en proyectos en los que tenía que abordar problemas de rendimiento, pero nunca fueron resueltos ni causados por Underscore.js ni Lodash. Y a menos que entienda las diferencias reales en implementación y rendimiento (estamos hablando de C++ en este momento) de, digamos, un bucle sobre un iterable (objeto o matriz, ¡disperso o no!), prefiero no molestarme. con cualquier reclamo basado en los resultados de una plataforma de referencia que ya tiene opiniones .
Sólo necesita una única actualización de, digamos, Rhino para prender fuego a sus implementaciones de métodos Array de una manera que ni un solo sacerdote de "métodos de bucle medieval funcionen mejor y para siempre y todo eso" pueda argumentar el simple hecho de que De repente, los métodos de matriz en Firefox son mucho más rápidos que su obstinado cerebro. ¡Hombre, simplemente no puedes engañar a tu entorno de ejecución engañando a tu entorno de ejecución! Piensa en eso a la hora de promocionar...
tu cinturón de herramientas
... La próxima vez.
Entonces, para que siga siendo relevante:
- Utilice Underscore.js si le gusta la comodidad sin sacrificar el estilo nativo.
- Utilice Lodash si le gusta la comodidad y le gusta su catálogo de funciones ampliado (copia profunda, etc.) y si necesita desesperadamente un rendimiento instantáneo y, lo más importante, no le importa conformarse con una alternativa tan pronto como las API nativas eclipsen a las obstinadas. soluciones alternativas. Lo cual va a suceder pronto. Período.
- Incluso hay una tercera solución. ¡Hazlo tú mismo! Conozca sus entornos. Conozca las inconsistencias. Lea su código ( John-David y Jeremy ). No utilice esto o aquello sin poder explicar por qué una capa de coherencia/compatibilidad es realmente necesaria y mejora su flujo de trabajo o mejora el rendimiento de su aplicación. Es muy probable que tus necesidades queden satisfechas con un simple polyfill que eres perfectamente capaz de escribir tú mismo. Ambas bibliotecas son simplemente vainilla con un poco de azúcar. Ambos simplemente pelean por quién sirve el pastel más dulce . Pero créanme, al final ambos se cocinan sólo con agua. No existe un Dios vainilla, por lo que no puede haber un Papa vainilla, ¿verdad?
Elija el enfoque que mejor se adapte a sus necesidades. Como siempre. Preferiría recurrir a implementaciones reales en lugar de trucos obstinados en tiempo de ejecución en cualquier momento, pero incluso eso parece ser una cuestión de gustos hoy en día. Cíñete a recursos de calidad como http://developer.mozilla.com y http://caniuse.com y todo irá bien.
Estoy de acuerdo con la mayoría de las cosas que se dicen aquí, pero solo quiero señalar un argumento a favor de Underscore.js: el tamaño de la biblioteca.
Especialmente en caso de que esté desarrollando una aplicación o un sitio web que pretenda usarse principalmente en dispositivos móviles, el tamaño del paquete resultante y el efecto en el tiempo de arranque o descarga pueden tener un papel importante.
A modo de comparación, estos tamaños son los que noté con source-map-explorer después de ejecutar Ionicserve :
Lodash: 523 kB
Underscore.js: 51.6 kB
Se puede utilizar BundlePhobia para comprobar el tamaño actual de Lodash y Underscore.js .