Por que alguém preferiria a lodash.js ou underscore.js biblioteca utilitária em vez da outra?
Lodash parece ser um substituto para o underscore, este último já existe há mais tempo.
Penso que ambos são brilhantes, mas não sei o suficiente sobre como funcionam para fazer uma comparação educada, e gostaria de saber mais sobre as diferenças.
Eu criei o Lo-Dash para fornecer um suporte mais consistente de iteração cruzada para arrays, strings, objetos, e objetos de argumentos
sup>1. Desde então ele se tornou um super conjunto de Underscore, fornecendo um comportamento API mais consistente, mais características (como suporte AMD, deep clone, e deep merge), mais completo documentação e testes unitários (testes que rodam em Node, Ringo, Rhino, Narwhal, PhantomJS, e navegadores), melhor desempenho geral e otimizações para grandes arrays/iteração de objetos, e mais flexibilidade com custom builds e utilitários de pré-compilação de modelos.
Como o Lo-Dash é atualizado com mais freqüência do que o Underscore, um lodash underscore
build é fornecido para garantir a compatibilidade com a última versão estável do Underscore.
Em certo ponto eu até recebi push access para Underscore, em parte porque Lo-Dash é responsável por levantar mais de 30 problemas; correções de bugs de aterrissagem, novas funcionalidades, & ganhos de performance em Underscore v1.4.x+.
Além disso, existem pelo menos 3 placas de caldeira Backbone que incluem Lo-Dash por padrão e Lo-Dash é agora mencionado na [documentação] oficial do Backbone7.
Confira o post do Kit Cambridge, Diga "Olá" para Lo-Dash, para uma subdivisão mais profunda sobre as diferenças entre Lo-Dash e Underscore.
Notas de rodapé:
argumentos
. Em browsers mais recentes, os métodos Underscore ignoram buracos em arrays, os métodos "Objects" iteram objetos argumentos
, strings são tratados como arrays, e os métodos iteram corretamente funções (ignorando sua propriedade "prototype") e objetos (iterando propriedades sombreadas como "toString" e "valueOf"), enquanto em browsers mais antigos eles não o farão. Além disso, métodos como _.clone' preservam buracos em arrays, enquanto outros como
_.flatten' não preservam.Lo-Dash é inspirado pelo sublinhado, mas hoje em dia é uma solução superior. Você pode fazer suas construções personalizadas, ter um maior desempenho, suportar AMD e ter grandes recursos extras. Veja este Lo-Dash vs Underscore benchmarks no jsperf e... este incrível post sobre lo-dash:
Uma das características mais úteis quando se trabalha com colecções, é a sintaxe de estenografia:
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 }]
(retirado de lodash docs)
Além da resposta de John, e lendo em lodash (que eu até então considerava um "me-too" para sublinhar), e vendo os testes de desempenho, lendo o código fonte, e posts no blog, os poucos pontos que fazem lodash muito superior ao sublinhado são estes:
Se você olhar para o código fonte do underscore, você vai ver nas primeiras linhas que destacam as falhas nas implementações nativas de muitas funções. Embora em um mundo ideal, esta teria sido uma abordagem melhor, se você olhar para alguns dos links perf dados em estes slides, não é difícil tirar a conclusão de que a qualidade dessas 'implementações nativas' variam muito de navegador para navegador. O Firefox é muito rápido em algumas das funções, e em algumas dominam o Chrome. (Imagino que haveria alguns cenários em que o IE também dominaria). Eu acredito que é melhor preferir um código cujo **desempenho*** seja mais consistente entre navegadores.
Leia o post do blog mais cedo, e em vez de acreditar nele por causa disso, julgue por si mesmo executando os [benchmarks] (http://lodash.com/benchmarks). Estou chocado agora mesmo, vendo um lodash realizando uma performance 100-150% mais rápida do que o sublinhado em funções até simples, nativas como
Array.every
no Chrome!
Aqui está uma lista de diferenças entre lodash, e é underscore-build é um substituto drop-in para seus projetos de underscore.