Lodash ou Underscore? Talvez, nenhum!

Durante os últimos anos, bibliotecas como Underscore e lodash, encontraram seu espaço no cinto de utilidades de muitos programadores JavaScript.

Embora essas bibliotecas de utilitários ajudem a escrever e até facilitar a sua vida em partes do seu código, não necessariamente, esse código, fica simples ou de fácil entendimento. Quem estiver lendo ou mantendo o código será obrigado há, além de conhecer sua aplicação e funcionalidades, também conhecer a biblioteca de utilitários que você está usando.

Bibliotecas vem e vão, e todo mundo tem sua favorita. Qual é a ordem de argumentos para essa função map()? De qual biblioteca que essa função vem? Underscore (o eterno favorito), lodash (o versátil e mais rápido irmão mais novo), Ramda (o primo que tem uma abordagem mais funcional, onde todos os argumentos começam pelo lado direito) ou qualquer abstração legal que você encontrar hoje em dia?

Se você estiver em um time, quais bibliotecas você escolheria? E se eu te disser que você pode escolher a biblioteca padrão do JavaScript?

Quando você escreve código usando a biblioteca padrão de funções, você está tornando ele mais fácil de se usar, entender e manter (aliás, pode ser você essa pessoa, daqui uns meses, quem sabe?).

Tudo bem que, talvez você tenha que digitar um pouco mais para atingir a mesma funcionalidade, mas, desde quando a velocidade que escrevemos código, é o gargalo para criar e manter um bom software? ;)

É mais fácil de recuperar uma não-abstração do que uma abstração errada.

- Sebastian Markbåge

É muito mais fácil arrumar um código verboso com poucas abstrações, do que códigos resumidos com uma abstração errada. Quando você começa a ver os padrões no seu código, repetidos por aqui e ali, é hora de abstrair. Você acaba tendo uma idéia de qual abstração você deve fazer, e provavelmente, vai acabar criando uma que valha a pena, mesmo contando com toda a sobrecarga que toda abstração adiciona.

JavaScript está evoluindo, e os novos padrões, ES2015 e ES2016(antes conhecidas como ES6 e ES7), trazem algumas novas possibilidades e, ferramentas como Babel, deixam isso ainda mais fácil de se usar hoje em dia. Com isso em mãos, essas bibliotecas de funções utilitárias ficam obsoletas.

Ótimos recursos para aprender mais sobre as novas funções, a página em inglês, Learn ES2015 no site do Babel e o livro, em inglês, Understanding ECMAScript 6, escrito pelo Nicholas C. Zakas. Aprender e utilizar todos os poderosos recursos do JavaScript, te dá uma segurança futura, pois elas terão vida mais longa do que a biblioteca do momento.

Mas não estou dizendo que não há espaço para bibliotecas de utilitários ou pacotes instalados via npm. Eu só estou dizendo que muitas das funções que eram essenciais para nós sermos produtivos quando escrevíamos ES3, podem ser escritas nativamente usando os recursos padrões do JavaScript.

E vou te dizer, talvez você não precise mesmo de Underscore ou lodash.

Exemplos

Esses exemplos demonstram funcionalidades do ES5.1, ES2015, ES2016 e as propostas para o ES2017. Eles ficaram tão simples que você não precisa aprender uma biblioteca externa mais.

O que eu preciso para usá-los hoje em dia?

ES5 é suportado atualmente em todos os navegadores e no Node.js. Exemplos usando ES2015+, podem ser compilados para ES5 usando Babel. É muito simples integrar o Babel no seu sistema, quase todas as ferramentas de automação hoje em dia tem uma integração oficial. Se você precisar dar suporte para navegadores antigos (IE8), você pode utilizar a biblioteca es-shim, que traz quase todos os polyffils para ES5.

Arrays

Iteração

// Underscore
_.each(array, fn)

Map

// Underscore
_.map(array, fn)

Usar uma função para acumular o valor de um array (da esquerda para a direita)

// Underscore
_.reduce(array, fn, init)

Usar uma função para acumular o valor de um array (da direita para a esquerda)

// Underscore
_.reduceRight(array, fn, init)

Testar se todos os elementos de um array passam em uma operação

// Underscore
_.every(array, fn)

Testar se um dos elementos de um array passam em uma operação

// Underscore
_.some(array, fn)

Achar um valor em um array

// Underscore
_.find(array, fn)

Pegar uma propriedade de cada elemento do array

// Underscore
_.pluck(array, prop)

Verificar se o array contém o elemento

// Underscore
_.includes(array, el)

Convertendo um objeto array-like em array

// Underscore
_.toArray(arguments)

Criando uma cópia do array e removendo todos os valores falsos

// Underscore
_.compact(array)

Criando uma cópia do array e removendo itens duplicados

// Underscore
_.uniq(array)

Achando o index de um valor no array

// Underscore
_.indexOf(array, val)

Achar o index de um valor no array baseado em uma operação

// Underscore
_.findIndex([4, 6, 7, 12], numPrimo);

Criar um array com N números, começando do X

// Underscore
_.range(x, x + n)

Objetos

Nomes de todas as propriedades enumeráveis do próprio objeto

// Underscore
_.keys(object)

Número de chaves em um objeto

// Underscore
_.size(object)

Nome de todas as propriedades enumeráveis em array

// Underscore
_.allKeys(object)

Valores

// Underscore
_.values(object)

Criar um novo objeto passando um prototype alvo e propriedades

// Underscore
_.create(proto, prop)

Criar um novo objeto a partir da mescla de suas propriedades

// Underscore
_.assign({}, source, { a: false })

Clonando um objeto e suas propriedades (cópia não recursiva de propriedades)

// Underscore
_.extendOwn({}, object)

Verificando se o dado objeto é um array

// Underscore
_.isArray(object)

Verificando se o objeto é um número finito

// Underscore
_.isNumber(object) && _.isFinite(object)

Funções

Vinculando funções a novos escopos (ou binding)

// Underscore
foo(_.bind(function () {
this.bar();
}, this));

Utilidades

Funções de identidade

// Underscore
_.identity

Uma função que retorna um valor

// Underscore
_.constant(value)

Funções vazias

// Underscore
_.noop

Pegar o valor to tempo em milisegundos

// Underscore
_.now()

Template

// Underscore
var greeting = _.template(“hello <%= name %>”);
greeting({ name: ‘moe’ });

Em resumo

Cada um dos exemplos demonstra as possibilidades que os novos padrões do JavaScript traz para nosso código do dia-a-dia.

Re-aprenda o JavaScript de hoje!

Créditos

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store