Três novidades no ES2018 que você precisa conhecer
O JavaScript não para de evoluir. Desde a primeira grande atualização na linguagem, em 2015 com o ES6 (depois rebatizado para ES2015), temos lançamentos anuais com correções, melhorias e novas funcionalidades.
O processo de atualização é coordenado pelo TC39, um comitê que conta com membros da comunidade e representantes de grandes empresas.
Um fato muito legal sobre o TC39: temos um brasileiro que é membro ativo do comitê, o Leo Balter.
Temos aqui no portal uma entrevista que fizemos com o Leo em 2016, na qual ele conta um pouco como o comitê funciona.
O ES2018 nos traz algumas novidades e melhorias bem interessantes.
Em junho de 2018 já devemos ter a versão oficializada pela ECMA International.
Agora, vamos conhecer três das funcionalidades oferecidas 👌
Asynchronous Iteration
O ES2015 trouxe muitas novidades. Uma delas foi o iterator (iterador), um objeto que oferece a funcionalidade de navegar entre os itens de uma lista ou estrutura – um a um – em sequência. Este objeto oferece o método next, o qual retornará o próximo item da lista no seguinte formato:
{ value: Mixed, done: Boolean } Você pode saber mais sobre Iterators no post Generators, yield e iterators, aqui no portal.
Iterators são muito legais e nos dão N possibilidades, porém, Iterators somente funcionam em dados síncronos.
Veja um exemplo:
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; let it = arr[Symbol.iterator](); console.log(it.next().value); // 1 console.log(it.next().value); // 2 console.log(it.next().value); // 3 console.log(it.next().value); // 4 A novidade no ES2018 é a sua possibilidade assíncrona.
Um iterator assíncrono, basicamente, é um iterator. Entretanto, o método next retorna uma Promise.
const { value, done } = syncIterator.next(); asyncIterator.next().then(({ value, done }) => /* ... */); Para fazer a iteração, agora temos o for await of, que faz exatamente o que parece, itera objetos iteráveis assincronamente. Legal, né? 🔥
for await (const line of readLines(filePath)) { console.log(line); } Veja mais na documentação da proposta.
Object Rest/Spread Properties
rest e spread também entraram no ES2015.
A sintaxe chamada de "destructuring assignment" é uma expressão JavaScript que torna possível descompactar valores de arrays ou propriedades de objetos e atribuir a variáveis novas.
Vejamos um exemplo:
var a, b, rest; [a, b] = [10, 20]; console.log(a); // expected output: 10 console.log(b); // expected output: 20 [a, b, ...rest] = [10, 20, 30, 40, 50]; console.log(rest); // expected output: [30,40,50] Veja mais sobre destructuring na MDN.
Basicamente, o ES2018 introduz a mesma possibilidade para objetos.
Rest:
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; x; // 1 y; // 2 z; // { a: 3, b: 4 } Spread:
let n = { x, y, ...z }; n; // { x: 1, y: 2, a: 3, b: 4 } Veja mais na documentação da proposta oficial.
Promise.prototype.finally()
Promises já estão no nosso dia a dia há um bom tempo.
Desenvolvedores JavaScript já vinham utilizando Promises antes mesmo de se tornar parte da linguagem (usando bibliotecas), também no ES2015.
A novidade do ES2018 é que agora Promises terão o finally.
Muitas bibliotecas existentes implementam o método finally, que é um callback para quando uma Promise está pronta, seja como fulfilled ou rejected.
Podemos pensar no finally como o já conhecido try/catch/finally, no qual o finally será sempre executado.
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···}); Veja mais na proposta oficial.
Conclusão
O ES2018 ainda traz outras novidades e melhorias, como novas funcionalidades para expressões regulares (RegExp) e uma revisão nos template literals.
O Dr. Axel Rauschmayer faz um excelente trabalho em seu blog 2ality, e lá ele escreveu sobre todas as novidades no post ECMAScript 2018: the final feature set.

