Artigo original: JavaScript ES6 — write less, do more

O JavaScript ES6 traz uma nova sintaxe e novos recursos incríveis para tornar seu código mais moderno e legível. Ele permite que você consiga fazer mais escrevendo menos código. O ES6 nos apresenta muitos recursos excelentes, como as arrow functions, template strings, desestruturação de classes, módulos e muito mais. Vamos conhecê-los.

const e let

const é uma nova palavra-chave em ES6 para declarar variáveis. Além disso, const é mais poderoso do que var. Isso porque, uma vez utilizada, não podemos reatribuir um novo valor à variável. Em outras palavras, trata-se de uma variável imutável, exceto quando usada com objetos.

Isso é bastante útil para direcionar os seletores. Por exemplo, quando temos um único botão que dispara um evento, ou quando você deseja selecionar um elemento HTML pelo JavaScript, use const ao invés de var. O principal motivo é que var tem um escopo maior. Portanto, é sempre preferível usar const quando não queremos que a variável seja reatribuída. Exemplo:

e4r4Zg1XTz395qj9A5hOpHMK0mzH0zwxitK9

No código acima, a variável const não vai mudar e não pode ser reatribuída. Se você tentar atribuir um novo valor a ela, vai receber uma mensagem de erro.

kM-LHiezWRHQa0aakmKyPrgd53riDwKnrSUa

Por sua vez,  uma variável let pode ser reatribuída, recebendo assim um novo valor. Neste caso, temos uma variável mutável.

O let é semelhante ao const no sentido de que ambos têm seu escopo restrito. O que significa que a variável só é acessível dentro do escopo em que foi declarada.

Arrow functions

As arrow functions são fantásticas. Elas deixam o seu código mais legível, melhor estruturado e com um visual moderno. Ao invés de usar isto:

CAtsmTIStmCZaK-7ej4vvuHzY-aqfNhRhevc

Use isto:

jaJg1ODAb7FcbQbWaQ8FwegEmTD4IsTtx7Of

Como você pode ver, as arrow functions têm um visual mais legível e limpo! Você não vai mais precisar usar a sintaxe antiga.

Você também pode usar as arrow functions em algumas das funções integradas do JavaScript, como: map, filter e reduce. Veja este exemplo:

2G7fWO8OuCNbdMXa7wiRxoncLZshsRxZ0WYR

A função map fica mais legível com a sintaxe das arrow functions do que ficava anteriormente. Usando o ES6, você consegue escrever códigos mais curtos e funcionais. Você pode fazer o mesmo com filter e reduce.

Template literals

As template literals — também conhecidas como template strings — são um recurso muito bacana do ES6. Com elas, não precisamos mais usar o operador de soma (+) para concatenar strings nem para usar variáveis dentro de uma string.

Como era na sintaxe antiga:

pyiP612uJAXA9gvXK0fnmxc9tb6J0WRSB3Nj

Como ficou com a nova sintaxe do ES6:

O1aAY7ehL3Vtvej0YXuZVXbN3LjHX2-WXzOG

Bem mais simples! Podemos notar uma grande diferença entre a sintaxe antiga e a do ES6. Para usar strings de maneira mais elaborada, as template strings do ES6 parecem mais organizadas e melhor estruturadas do que o que tínhamos antes.

Parâmetros padrão

Costumo usar os parâmetros padrão quando trabalha com a linguagem PHP. Esse recurso permite definir um parâmetro com antecedência.

Desse modo, você não receberá um erro de retorno indefinido caso esqueça de passar um parâmetro. Esse erro é evitado porque a predefinição do parâmetro já foi feita. Assim, quando você rodar uma função e esquecer de passar o parâmetro, o retorno será o valor do parâmetro padrão. Como bônus, não vai receber um erro por causa disso!

Vamos ilustrar isso melhor com o seguinte exemplo:

qFmJ6F0gOBdVl4kJ7sFhIqHaGIZx6iehhoML

A função acima retorna undefined porque esquecemos de passar o segundo parâmetro: age.

No entanto, se usássemos um parâmetro padrão, não teríamos um retorno undefined. Usaríamos o valor padrão caso esquecêssemos de passar esse parâmetro!

-RczdieWIpZVTLYih1PD4ZJdq2UeurbiMBHu

Como você pode ver, a função retorna o valor mesmo quando não passamos o segundo parâmetro. Com o parâmetro padrão, conseguimos antecipar o erro e evitá-lo.

Desestruturação de arrays e objetos

O processo de desestruturação facilita a atribuição de valores de um array ou de um objeto a uma nova variável.

Como era na sintaxe antiga:

rsZwpm7Ah7OyThsTpkBsaRUsCwjQBSGCGEfG

Como ficou com a nova sintaxe do ES6:

rrKo0LFQOblpaAIlywUGrtD8keMqwywZ5MXR

Anteriormente, precisávamos atribuir manualmente cada valor a uma variável. Na ES6, porém, basta colocarmos nossas variáveis entre chaves para obtermos qualquer propriedade de um objeto.

Observação: se o nome da variável que você usar não for igual ao nome da propriedade, vai ter um retorno undefined. Por exemplo, se o nome da propriedade for name e a atribuirmos a uma variável chamada username, o retorno vai ser undefined.

Precisamos sempre manter o nome da variável igual ao nome da propriedade do objeto. Porém, se quisermos renomear essa variável, podemos usar os dois pontos (:). Como no seguinte exemplo:

zLZ3XTvYSXB3UiRg2W05YXGcHa6GJGqEQJLa

Para arrays, usamos uma sintaxe semelhante à dos objetos. A única diferença é que usamos colchetes ao invés de chaves. Veja no seguinte exemplo:

JUcyaqc4T9qdXgQbYCqfbi10THAatzHh64ts

Importação e exportação

Uma aplicação em JavaScript fica mais poderosa com o uso de import e export. Esses recursos permitem a criação de componentes separados e reutilizáveis.

Se você estiver familiarizado com algum framework MVC (model–view–controller) do JavaScript, vai perceber que — na maioria das vezes — esses frameworks usam import e export para lidar com componentes. Como essa importação e exportação funciona?

É simples! O export permite a exportação de um módulo para ser usado em outro componente JavaScript. Por sua vez, o import serve para importar esse módulo e usá-lo em nosso componente.

Vamos a um exemplo. Considere que temos dois arquivos. O primeiro foi nomeado como detailComponent.js e o segundo como homeComponent.js.

Primeiro, vamos exportar a função detail do detailComponent.js. Fazemos isso da seguinte maneira:

3K3KNLMTvnsVpk2EEx100lAURNgW7fXzBauC

Depois, vamos simplesmente usar import para acessar essa função em homeComponent.js. Isso é feito deste modo:

IB6KSO6rK-574uNXuX5tDUIly6NkqIsT7cpZ

Para importar mais de um módulo de um mesmo arquivo, basta colocar os nomes desses módulos entre chaves na declaração da importação. Como no seguinte exemplo:

yeJzCdTfkuZEd-PL9oLX7DWO-cukNHKrLt-5

Não é legal?

Promises

As promises são uma novidade do ES6. Trata-se de um método para escrever código assíncrono. Elas podem ser usadas quando, por exemplo, queremos buscar dados de uma API ou quando usamos uma função que leva algum tempo para ser executada. As promises facilitam a resolução de casos assim. Então, vamos criar nossa primeira promise!

zVsFm1MnCkDU9oPLEmfRhLJiA0dyH1nKCa7C

Se olhar no console, vai ver que ele retorna uma promise. Sendo assim, se quisermos executar uma função depois de obter os dados requeridos, vamos usar uma promise. As promises recebem dois parâmetros: resolve e reject. Para caso de sucesso e de erro, respectivamente.

Observação: a função fetch retorna nada menos do que uma promise!

const url='https://jsonplaceholder.typicode.com/posts';
const getData=(url)=>{return fetch(url);}
getData(url).then(data=> data.json()).then(result=> console.log(result));

Se olhar o resultado no console, você vai notar que o retorno é um array de dados.

Parâmetro rest e o operador de spread

Os parâmetros rest são usados para obter o argumento de um array e retornar um novo array. Seguem alguns exemplos:

ZGyyj2ByWBRUpEw841VQRKGXPX6KV4aeyRyf
SEt08SKlukqs7SSkDBoRHt-0dc9s2zrEpBDr

O operador de spread (ou "operador de espalhamento") tem uma sintaxe semelhante à do parâmetro rest, com o diferencial de que o operador de spread pega o array em si e não apenas os argumentos dele. Podemos usar o operador de spread para obter os valores de um array ao invés de fazer o mesmo com um laço de repetição ou algo assim. Aqui temos um exemplo desse operador em ação:

const arr=['said',20,'JavaScript enthusiast','Hi','Said','How are you?'];

const Func=(...anArray)=>{
  return anArray;
}

console.log(Func(arr));

//output  ["said", 20, "JavaScript enthusiast", "Hi", "Said", "How are you?"

Classes

As classes são o ponto central da programação orientada a objetos (POO). Elas tornam seu código mais seguro e encapsulado. O uso de classes dá ao seu código uma boa estrutura e o mantém orientado.

2EGxzbm25W2EtzYv67c-N49DAqTMw01iZ2Ok

Para criar uma classe, basta usar a palavra-chave class, dar um nome a essa classe e finalizar com um bloco de chaves.

0K889E--nHdRPGY1nCVvUzCtAWGkDe8vPfCa

Feito isso, podemos acessar os métodos e as propriedades da classe através da palavra-chave new. Exemplo:

class myClass{
    constructor(name,age){
    this.name=name;
    this.age=age;
}
}
const Home= new myClass("said",20);
console.log(Home.name)//  said

Para herdar as propriedades de outra classe, é só usar a palavra-chave extends e informar o nome da classe de que deseja herdar. Veja no seguinte exemplo:

rTlJ5DgmaUL1ZCoy1EEKxCt4TK2ihUeWVd-M

Você pode aprender mais sobre classes aqui.

Você também pode explorar outros recursos incríveis do ES6 aqui (website em inglês).

Conclusão

O autor espera que o artigo tenha sido útil e que tenha conseguido apresentar bem alguns dos recursos do ES6. Ele também convida os leitores interessados a se inscreverem nesta lista de e-mails para receber mais conteúdo sobre front-end. Por fim, o autor agradece a você por ter lido este artigo.

Além disso, o autor também informa que trabalhou recentemente com um ótimo grupo de engenheiros de software para a criação de uma de suas aplicações para dispositivos móveis. Ele disse que a empresa era excelente, e que o produto foi entregue com bem mais rapidez do que outras empresas e freelancers com quem ele trabalhou. Com isso, ele conclui que pode recomendar essa empresa para quem tiver interesse em ter seus projetos desenvolvidos. Se for do seu interesse, pode contatar o autor do artigo e perguntar sobre o assunto através do e-mail: said@devsdata.com.