Por que alguém prefere a biblioteca de utilitários lodash.js ou underscore.js em detrimento da outra?
Lodash parece ser um substituto para o sublinhado, este último há mais tempo.
Penso que ambos são brilhantes, mas não sei o suficiente sobre como eles funcionam para fazer uma comparação educada e gostaria de saber mais sobre as diferenças.
underscore.js
javascript
lodash
Brian M. Hunt
fonte
fonte
lodash
eunderscore
estão sob rosca merge agoraRespostas:
Criei o Lo-Dash para fornecer suporte de iteração entre ambientes mais consistente para matrizes, seqüências de caracteres, objetos e
arguments
objetos 1 . Desde então, tornou-se um superconjunto do Underscore, fornecendo um comportamento de API mais consistente, mais recursos (como suporte AMD, clone profundo e mesclagem profunda), documentação mais completa e testes de unidade (testes executados em Node, Ringo, Rhino, Narwhal, PhantomJS e navegadores), melhor desempenho geral e otimizações para matrizes grandes / iteração de objetos e mais flexibilidade com construções personalizadas e utilitários de pré-compilação de modelos.Como o Lo-Dash é atualizado com mais frequência que o Underscore, é fornecida uma
lodash underscore
compilação para garantir a compatibilidade com a versão estável mais recente do Underscore.A certa altura, recebi até acesso push ao Underscore, em parte porque Lo-Dash é responsável por levantar mais de 30 questões; correções de erros de aterrissagem, novos recursos e ganhos de desempenho no Underscore v1.4.x +.
Além disso, existem pelo menos três boilerplates do Backbone que incluem Lo-Dash por padrão e o Lo-Dash agora é mencionado na documentação oficial do Backbone .
Confira o post de Kit Cambridge, Diga "Olá" a Lo-Dash , para uma análise mais profunda das diferenças entre Lo-Dash e Underscore.
Notas de rodapé:
arguments
objetos. Nos navegadores mais recentes, os métodos de sublinhado ignoram os buracos nas matrizes , os métodos "Objetos" iteramarguments
objetos, as seqüências de caracteres são tratadas como matrizes e os métodos iteram corretamente as funções (ignorando sua propriedade "prototype") e os objetos (iterando propriedades sombreadas como "toString" e "valueOf"), enquanto em navegadores mais antigos eles não o fazem. Além disso, os métodos de sublinhado, como_.clone
preservar orifícios nas matrizes, enquanto outros, como_.flatten
não.fonte
Lo-Dash é inspirado em sublinhado, mas hoje em dia é uma solução superior. Você pode criar suas construções personalizadas , ter um desempenho mais alto , dar suporte à AMD e ter ótimos recursos extras . Confira estes benchmarks Lo-Dash vs Underscore no jsperf e .. este post incrível sobre lo-dash :
Um dos recursos mais úteis quando você trabalha com coleções é a sintaxe abreviada:
(extraído de documentos do lodash )
fonte
filter
recurso no sublinhado a partir de 2012 github.com/jashkenas/underscore/issues/648 (seu nome éwhere
)Se, como eu, você esperava uma lista de diferenças de uso entre sublinhado e lodash, há um guia para migrar de sublinhado para lodash .
Aqui está o estado atual da posteridade:
fonte
Além da resposta de John, e lendo o lodash (que até então eu considerava um "eu-demais" para sublinhar), e vendo os testes de desempenho, lendo o código-fonte e as postagens do blog , os poucos pontos que fazem o lodash muito superiores ao sublinhado são:
Não se trata da velocidade, mas da consistência da velocidade (?)
Os extras no lodash também são bastante úteis.
Aqui está uma lista de diferenças entre o lodash e o underscore-build é um substituto para seus projetos de sublinhado.
fonte
Estamos em 2014 e dois anos tarde demais. Ainda acho que meu argumento é válido:
IMHO esta discussão ficou fora de proporção um pouco. Citando a postagem do blog acima mencionada :
Como se "loops simples" e "Javascript vanilla" fossem mais nativos que as implementações de métodos Array ou Object. Eita ...
Certamente seria bom ter uma única fonte de verdade, mas não existe. Mesmo que você tenha dito o contrário, não há Deus Vanilla, minha querida. Eu sinto Muito. A única suposição que realmente vale é que todos nós estamos escrevendo código Javascript que visa ter um bom desempenho em todos os principais navegadores, sabendo que todos eles têm implementações diferentes das mesmas coisas. É uma merda lidar com isso, para dizer o mínimo. Mas essa é a premissa, goste ou não.
Talvez vocês estejam trabalhando em projetos de grande escala que precisam de desempenho twitterish, para que você realmente veja a diferença entre 850.000 (sublinhado) vs. 2.500.000 (lodash) iterações em uma lista por segundo agora!
Eu, pelo menos não sou. Quero dizer, trabalhei em projetos nos quais tinha que resolver problemas de desempenho, mas eles nunca foram resolvidos ou causados por Underscore nem Lo-Dash. E, a menos que eu compreenda as diferenças reais de implementação e desempenho (estamos falando de C ++ agora), digamos um loop sobre um iterável (objeto ou matriz, esparso ou não!), Prefiro não me incomodar com nenhum reivindicações com base nos resultados de uma plataforma de benchmark que já é opinativa .
Ele precisa apenas de uma única atualização, digamos que o Rhino ative suas implementações do método Array de uma maneira que nem um único "método medieval de loop tenha um desempenho melhor e para sempre e outros" sacerdotes possam argumentar sobre o simples fato de que todos Os métodos de matriz repentina na FF são muito mais rápidos do que o seu cérebro opinativo. Cara, você simplesmente não pode enganar seu ambiente de execução enganando seu ambiente de execução! Pense nisso ao promover ...
... próxima vez.
Portanto, para mantê-lo relevante:
Escolha a abordagem que melhor atenda às suas necessidades. Como sempre. Eu preferiria fallbacks em implementações reais do que truques opinativos de tempo de execução a qualquer momento, mas mesmo isso parece ser uma questão de gosto hoje em dia. Atenha-se a recursos de qualidade como http://developer.mozilla.com e http://caniuse.com e você ficará bem.
fonte
Array.from
eles, provavelmente nem saberiam o que deveria fazer. O pessoal da JS "cinto de utilidades" parece estar tão preocupado com a promoção de soluções alternativas tão geniais que elas tendem a esquecer que, ao fazer isso, estão realmente diluindo o processo de padronização. Nenhuma necessidade de recursos leva a nenhuma pressão sobre os "fabricantes" do navegador. Curiosidade: dois dos quatro principais navegadores são baseados em projetos de código aberto ( 1 , 2 ).Estou de acordo com a maioria das coisas mencionadas aqui, mas só quero apontar um argumento a favor do underscore.js: o tamanho da biblioteca.
Especialmente no caso de você estar desenvolvendo um aplicativo ou site que pretende ser usado principalmente em dispositivos móveis, o tamanho do pacote resultante e o efeito no tempo de inicialização ou download podem ter um papel importante.
Para comparação, esses tamanhos são aqueles que notei com o source-map-explorer após executar o serviço iônico:
editado em fevereiro de 2020 :
pode-se usar o BundlePhobia para verificar o tamanho atual do Lo-Dash e Underscore
fonte
source-map-explorer after running ionic serve
Não tenho certeza se é isso que OP significava, mas me deparei com essa pergunta porque estava procurando uma lista de problemas que devo ter em mente ao migrar de sublinhado para lodash.
Eu realmente aprecio se alguém postou um artigo com uma lista completa dessas diferenças. Deixe-me começar com as coisas que aprendi da maneira mais difícil (ou seja, coisas que fizeram meu código explodir na produção: /):
_.flatten
O sublinhado é profundo por padrão e você deve passar true como segundo argumento para torná-lo superficial. No lodash, é raso por padrão e passa true, pois o segundo argumento o tornará profundo! :)_.last
em sublinhado aceita um segundo argumento que informa quantos elementos você deseja. Emlodash
não existe essa opção. Você pode emular isso com.slice
_.first
(mesmo problema)_.template
O sublinhado pode ser usado de várias maneiras, uma das quais é fornecer a sequência e os dados do modelo eHTML
voltar (ou pelo menos foi assim que funcionou há algum tempo). Aolodash
receber uma função que você deve alimentar com os dados._(something).map(foo)
funciona em sublinhado, mas em lodash eu tive que reescrevê-lo para_.map(something,foo)
. Talvez isso fosse apenas umaTypeScript
questãofonte
_(something).map(foo).value()
.http://benmccormick.org/2014/11/12/underscore-vs-lodash/
Último artigo comparando os dois de Ben McCormick:
fonte
Acabei de encontrar uma diferença que acabou sendo importante para mim. A versão não-sublinhado compatível do lodash de
_.extend()
que não copiar propriedades ou métodos de classe definida de nível.Eu criei um teste Jasmine no CoffeeScript que demonstra isso:
https://gist.github.com/softcraft-development/1c3964402b099893bd61
Felizmente,
lodash.underscore.js
preserva o comportamento do Underscore de copiar tudo, o que para a minha situação era o comportamento desejado.fonte
O lodash possui um valor
_.mapValues()
idêntico ao do underescore_.mapObject()
.fonte
Na maior parte, o sublinhado é um subconjunto de lodash. Às vezes, como o sublinhado atualmente terá pequenas funções legais que o lodash não possui como o mapObject. Este me poupou muito tempo no desenvolvimento do meu projeto.
fonte
Eles são bem parecidos, com Lodash assumindo o controle ...
Ambos são uma biblioteca de utilitários que leva o mundo da utilidade em JavaScript ...
Parece que o Lodash está sendo atualizado com mais regularidade agora, portanto, mais usado nos projetos mais recentes ...
Também o Lodash parece ser mais leve por alguns KBs ...
Ambos têm uma boa API e doc, mas acho que a Lodash é melhor ...
Aqui está uma captura de tela para cada um dos documentos para obter o primeiro valor de uma matriz ...
sublinhado:
lodash:
Como as coisas podem ser atualizadas de tempos em tempos, basta verificar o site também ...
lodash
sublinhado
fonte