Pregunta Diferencias entre lodash y guión bajo


¿Por qué alguien preferiría el lodash.js o underscore.js biblioteca de utilidad sobre el otro?

Lodash parece ser un reemplazo directo para el guion bajo, el último ha existido por más tiempo.

Creo que ambos son geniales, pero no sé lo suficiente sobre cómo funcionan para hacer una comparación educada, y me gustaría saber más sobre las diferencias.


1400
2017-12-09 17:08


origen


Respuestas:


Creé Lo-Dash para proporcionar compatibilidad de iteración entre entornos más uniforme para matrices, cadenas, objetos y arguments objetos1. Desde entonces, se ha convertido en un superconjunto de Underscore, que proporciona un comportamiento API más uniforme, más caracteristicas (como soporte de AMD, clon profundo y fusión profunda), más completo documentación y pruebas unitarias (pruebas que se ejecutan en Node, Ringo, Rhino, Narwhal, PhantomJS y navegadores), mejor rendimiento general y optimizaciones para matrices grandes / iteración de objetos, y más flexibilidad con compilaciones personalizadas y utilidades de precompilación de plantillas.

Debido a que Lo-Dash se actualiza con más frecuencia que Subrayar, una lodash underscore construir está provisto para garantizar la compatibilidad con la última versión estable de Underscore.

En un momento dado, incluso me dieron acceso de empuje subrayar, en parte porque Lo-Dash es responsable de plantear más de 30 problemas; correcciones de errores de aterrizaje, nuevas funciones y ganancias de rendimiento en Underscore v1.4.x +.

Además, hay por lo menos 3 esquemas básicos de Backbone que incluyen Lo-Dash por defecto y Lo-Dash ahora se menciona en el oficial de Backbone. documentación.

Echa un vistazo a la publicación de Kit Cambridge, Di "Hola" a Lo-Dash, para un análisis más profundo de las diferencias entre Lo-Dash y Underscore.

Notas al pie:

  1. Underscore tiene soporte inconsistente para matrices, cadenas, objetos y arguments objetos. En los navegadores más nuevos, los métodos de subrayado ignoran agujeros en matrices, Los métodos de "Objetos" iteran arguments los objetos, las cadenas se tratan como una matriz, y los métodos iteran 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 subrayado como _.clone preservar los agujeros en las matrices, mientras que a otros les gusta _.flatten no lo hagas

1777
2017-12-16 05:34



Lo-Dash está inspirado en el guión bajo, pero hoy en día es una solución superior. Puedes hacer tu compilaciones personalizadas, tener un mayor rendimiento, soportar AMD y tener grandes características adicionales. Mira esto Puntos de referencia Lo-Dash vs Underscore en jsperf y ... esto impresionante publicación sobre lo-dash:

Una de las características más útiles cuando trabajas con colecciones es la sintaxis abreviada:

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 }]

(tomado de lodash docs)


165
2017-12-13 21:51



Además de la respuesta de John, y leyendo sobre lodash (que hasta ahora había considerado como un "yo también" para subrayar), y viendo las pruebas de rendimiento, leyendo el código fuente, y publicaciones de blog, los pocos puntos que hacen que lodash sea mucho mejor que el subrayado son estos:

  1. No se trata de la velocidad, ya que se trata de consistencia de velocidad (?)

    Si nos fijamos en el código fuente del guión bajo, verá en las primeras líneas que el subrayado retrocede en las implementaciones nativas de muchas funciones. Aunque en un mundo ideal, este hubiera sido un mejor enfoque, si nos fijamos en algunos de los enlaces perf que se ofrecen en estas diapositivas, no es difícil llegar a la conclusión de que la calidad de esas 'implementaciones nativas' varía mucho de navegador a navegador. Firefox es extremadamente rápido en algunas de las funciones, y en algunos Chrome domina. (Imagino que habría algunos escenarios donde IE dominaría también). Creo que es mejor preferir un código cuyo actuación es más consistente en todos los navegadores.

    Lea la publicación del blog más temprano, y en lugar de creerlo por sí mismo, juzgue usted mismo ejecutando el blog puntos de referencia. Estoy aturdido en este momento, viendo un lodash realizando 100-150% más rápido que el guion bajo, incluso sencillo, nativo funciones tales como Array.every ¡en Chrome!

  2. los extras en lodash también son bastante útiles.

  3. En cuanto al comentario sumamente vocinglero de Xananax que sugiere la contribución al código del subrayado: siempre es mejor tener BUENO competencia, no solo mantiene la innovación en marcha, sino que también te impulsa a mantenerte (o a tu biblioteca) en buena forma.

Aquí hay un lista de diferencias entre lodash, y es subrayado-build es un reemplazo directo para tus proyectos de subrayado.


57
2017-08-18 14:18



Si, como yo, esperabas una lista de diferencias de uso entre subrayado y lodash, hay un guía para migrar de guión bajo a lodash.

Aquí está el estado actual de la posteridad:

  • Guion bajo _.compose es Lodash _.flowRight
  • Guion bajo _.contains es Lodash _.includes
  • Guion bajo _.findWhere es Lodash _.find
  • Guion bajo _.invoke es Lodash _.invokeMap
  • Guion bajo _.mapObject es Lodash _.mapValues
  • Guion bajo _.pluck es Lodash _.map
  • Guion bajo _.where es Lodash _.filter
  • Guion bajo _.any es Lodash _.some
  • Guion bajo _.all es Lodash _.every
  • Guion bajo _.each no permite salir al regresar false
  • Guion bajo _.flatten es profundo por defecto mientras Lodash es superficial
  • Guion bajo _.isFinite no se alinea con Number.isFinite
       (p.ej. _.isFinite('1') devoluciones true en Underscore pero false en   Lodash)
  • Guion bajo _.matches la taquigrafía no admite comparaciones profundas
       (p.ej. _.filter(objects, { 'a': { 'b': 'c' } }))
  • Subrayar ≥ 1.7 y Lodash han cambiado su _.template sintaxis a
    _.template(string, option)(data)
  • Lodash _.uniq no acepta un iteratee funciona como Underscore's. Use Lodash _.uniqBy
  • Lodash _.first y ._last no aceptes un n argumento como Underscore's. Utilizar slice
  • Lodash _.memoize los cachés son Map como objetos
  • Lodash apoya encadenamiento implícito, encadenamiento perezoso, y atajo   fusión
  • Lodash dividió su sobrecargado _.head, _.last, _.rest, Y _.initial hacia
      _.take, _.takeRight, _.drop, Y    _.dropRight
       (es decir. _.head(array, 2) en Underscore es    _.take(array, 2) en Lodash)

55
2017-07-21 09:35



Esto es 2014 y un par de años demasiado tarde. Todavía creo que mi punto es válido:

En mi humilde opinión, esta discusión se desató bastante. Citando lo mencionado anteriormente entrada en el blog:

La mayoría de las bibliotecas de utilidades de JavaScript, como Underscore, Valentine y   wu, confíe en el "enfoque dual nativo primero". Este enfoque prefiere   implementaciones nativas, volviendo a JavaScript simple solo si el   el equivalente nativo no es compatible. Pero jsPerf reveló un interesante   tendencia: la forma más eficiente de iterar sobre una matriz o matriz   colección es evitar por completo las implementaciones nativas, optando por   bucles simples en su lugar.

Como si "bucles simples" y "Javascript vainilla" fueran más nativos que las implementaciones de métodos Array o Object. Por Dios ...

Ciertamente sería bueno tener una sola fuente de verdad, pero no la hay. Incluso si te han dicho lo contrario, no hay Dios Vainilla, querida. Lo siento. La única suposición que realmente se cumple es que todos estamos escribiendo código Javascript que apunta a funcionar bien en todos los principales navegadores, sabiendo que todos ellos tienen implementaciones diferentes de las mismas cosas. Es una perra con la que lidiar, por decirlo suavemente. Pero esa es la premisa, te guste o no.

Tal vez ustedes están trabajando en proyectos a gran escala que necesitan un rendimiento de Twitter para que realmente vean la diferencia entre 850,000 (subrayado) vs. 2,500,000 (lodash) iteraciones en una lista por segundo ¡ahora mismo!

Yo por una no soy. Quiero decir, trabajé en proyectos en los que tuve que abordar problemas de rendimiento, pero nunca fueron resueltos ni causados ​​ni por Underscore ni por Lo-Dash. Y a menos que tenga acceso a las diferencias reales en la implementación y el rendimiento (estamos hablando de C ++ en este momento) de digamos un ciclo sobre un iterable (objeto o matriz, disperso o no!), Prefiero no molestarme con ningún reclamaciones basadas en los resultados de una plataforma de referencia que ya es obstinado.

Solo necesita una actualización de, digamos, Rhino para establecer sus implementaciones de método Array de forma tal que ni un solo "método de bucle medieval funcione mejor y para siempre y qué" el sacerdote pueda argumentar en torno al simple hecho de que todos un método de matriz repentino en FF es mucho más rápido que su brainfrute obstinado. ¡Hombre, no puedes engañar a tu entorno de ejecución haciendo trampa en tu entorno de tiempo de ejecución! Piense en eso cuando promocione ...

su cinturón de herramientas

... la próxima vez.

Entonces para mantenerlo relevante:

  • Usa subrayado si te gusta la conveniencia sin sacrificar ish nativo.
  • Use Lo-Dash si le gusta la conveniencia y le gusta su catálogo de funciones extendido (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 el API nativo se vea eclipsado. workaurounds obstinados. Que va a suceder pronto Período.
  • Incluso hay una tercera solución. DIY! Conoce tus ambientes Conozca las incoherencias. Lea su (John-Davidy Jeremy's) código. No use esto o aquello sin poder explicar por qué una capa de compatibilidad / coherencia es realmente necesaria y mejora su flujo de trabajo o mejora el rendimiento de su aplicación. Es muy probable que sus requisitos estén satisfechos con un simple relleno sintético que pueda escribir usted mismo. Ambas bibliotecas son simplemente simples con un poco de azúcar. Ambos pelean por quién sirve el pastel más dulce. Pero créanme, al final ambos solo están cocinando con agua. No hay Dios de Vanilla así que no puede haber Papa de Vainilla, ¿verdad?

Elija el enfoque que mejor se adapte a sus necesidades. Como siempre. Prefiero los errores en las implementaciones reales sobre los tramposos en tiempo de ejecución obstinado en cualquier momento, pero incluso eso parece ser una cuestión de gusto hoy en día. Mantener los recursos de calidad como http://developer.mozilla.com y http://caniuse.com y estarás bien.


43
2017-09-11 21:27



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 ser utilizado principalmente en dispositivos móviles, el tamaño del paquete resultante y el efecto sobre el arranque o el tiempo de descarga pueden tener un papel importante.

Para comparar, estos tamaños son los que noté con source-map-explorer después de ejecutar el servicio iónico:

lodash: 523kB
underscore.js: 51.6kb

14
2018-04-26 14:20



No estoy seguro de si eso es lo que OP significaba, pero me topé con esta pregunta porque estaba buscando una lista de problemas que debo tener en cuenta al migrar de subrayado a lodash.

Realmente agradecería que alguien publicara un artículo con una lista completa de tales diferencias. Permítanme comenzar con las cosas que aprendí por las malas (es decir, las cosas que hicieron que mi código explotara en la producción: /):

  • _.flatten en guión bajo es profundo por defecto y debe pasar cierto como segundo argumento para hacerlo superficial. ¡En lodash es superficial por defecto y pasar verdadero como segundo argumento lo hará profundo! :)
  • _.last en guión bajo acepta un segundo argumento que indica cuántos elementos desea. En lodash no hay tal opción Puedes emular esto con .slice
  • _.first (mismo problema)
  • _.template en subrayado se puede utilizar de muchas maneras, una de las cuales es proporcionar la cadena de plantilla y los datos y obtener HTML volver (o al menos así es como funcionó hace algún tiempo). En lodash usted recibe una función que luego debe alimentar con los datos.
  • _(something).map(foo) trabaja en guión bajo, pero en lodash tuve que reescribirlo para _.map(something,foo). Quizás eso fue solo una TypeScript-problema

9
2018-03-25 12:16



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

El último artículo que compara los dos por Ben McCormick:

  1. API de Lo-Dash es un superconjunto de Underscore.

  2. Debajo del capó [Lo-Dash] ha sido completamente reescrito.

  3. Lo-Dash definitivamente no es más lento que Underscore.

  4. ¿Qué ha agregado Lo-Dash?

    • Mejoras de usabilidad
    • Funcionalidad extra
    • Ganancias de rendimiento
    • Sintaxis abreviadas para encadenar
    • Creaciones personalizadas para usar solo lo que necesitas
    • Versiones semánticas y cobertura de código 100%

8
2017-12-07 12:19