Google I/O 2019 — O que há de novo no JavaScript?

Lucas Reis
Senior Mega
Published in
6 min readMay 15, 2019
Mathias Bynens @ Google I/O 2019 (Google)

JavaScript

É uma das linguagens mais utilizadas e conhecidas entre desenvolvedores do mundo inteiro. Inicialmente ela foi planejada para melhorar a interação do usuário na web e graças ao time de desenvolvimento da Google, em 2008 surgiu o V8. V8 é uma engine open source de alta performance escrita em C++. Atualmente ela é utilizada no Chrome e também no Node.JS e suas constantes atualizações e melhorias, possibilitam a criação de aplicações robustas de frontend e de backend. Nesse ano surgiram muitas novidades, bora conferir!

Performance

Promises mais velozes!

As Promises na versão mais recente do Node.JS, estão sendo interpretadas 11x mais rápidas que na versão 7.

Menor consumo de memória

Além das mudanças e melhorias realizadas na interpretação do JavaScript, o consumo de memória foi reduzido em até 20%!

O uso da memória foi reduzido em até 20% (Google)
Implementações feitas e já disponíveis na última versão do Chrome (Google)

Novas implementações na linguagem!

As novas implementações aconteceram após o TC39. TC39 é um comitê público do JavaScript, responsável por sugerir e promover mudanças na linguagem. Qualquer pessoa pode interagir nesses processos. Github: https://github.com/tc39/ecma262.

Declaração de atributos de uma classe

Essa mudança, possibilitou a criação de atributos públicos e privados sem a necessidade de estar dentro de um método construtor. Logo abaixo as comparações:

Em vermelho o antigo e em verde após a mudança (Google)

Atributos privados

Os métodos privados, agora podem ser declarados com uma # ao invés da palavra reservada private. E quando há uma tentativa de acesso a partir de uma classe externa, um erro de SyntaxError é retornado.

Essas novas implementações, estão disponíveis nas seguintes plataformas:

Google Chrome e Node.JS (Google)

String.matchAll(regex);

O método matchAll(regex) permite retornar todas as ocorrências encontradas a partir de uma determinada expressão regular.

Essa funcionalidade encontra-se disponível nas seguintes plataformas:

Intl & BigInt;

Nessa mudança, foi melhorado a precisão dos resultados de operações do tipo BigInt e foi compatibilizado com a classe de internacionalização. A classe de internacionalização também é muito útil para formatar valores para vários tipos de idiomas, a documentação completa você confere aqui.

Suporte do BigInt ao Intl (Google)

Já disponível nas seguintes plataformas:

Array#{flat, flatMap};

Agora ficou muito mais simples de reduzir os níveis da sua array multidimensional, chega de lodash para isso.

Com a implementação do flat(), é possível determinar quantos níveis você quer deixar mais “plana” a sua array, inclusive, você pode executar de maneira recursiva caso passe como parâmetro o valor Infinity.

Implementação do método flat() (Google)

Quanto ao flatMap(), ele irá iterar sob os valores de um array, aplicando uma função x e a deixando plana. Seu uso pode ser um pouco mais específico, desenvolvedores mais acostumados com Functional Programming, terão extrema facilidade em compreender o uso dessa função!

flatMap() já realiza o trabalho do map().flat() (Google)

Funcionalidades disponíveis nas seguintes plataformas:

Object.entries({});

Essa função permite converter objetos em array de uma maneira simples e objetiva.

Object.entries({}) (Google)

Object.fromEntries([]);

Caso você queira converter o array em objeto, o método Object.fromEntries(), facilita demais esse processo!

Object.fromEntries([]); (Google)

Em casos específicos, o Object.fromEntries() possibilita a conversão de um Map para um Object.

Funcionalidades disponíveis nas seguintes plataformas:

globalThis;

A palavra globalThis, torna-se privada a partir de agora! Com essa variável, é possível acessar o contexto global da sua aplicação.

Métodos como esse, são comuns para identificar e retornar o contexto da aplicação, mas em casos específicos, infelizmente não há compatibilidades.

Gambiarra para identificar o escopo global (Google)

Com a palavra globalThis, esse problema foi solucionado.

globalThis; (Google)

Funcionalidades disponíveis nas seguintes plataformas:

Estabilidade no Array.sort();

A função de ordenar era instável em casos que já haviam uma ordem alfabética em uma determinada lista.

Na imagem quadriculada em vermelho, na hora de ordenar os doggos por rating, Ghost acabava sendo o primeiro da lista, o que não era o resultado esperado. Na imagem quadriculada em verde, esse problema foi corrigido!

Funcionalidades disponíveis nas seguintes plataformas:

Intl.* APIs

Adições foram feitas na biblioteca de internacionalização, tudo para facilitar a conversão de valores e datas, sem haver a necessidade de bibliotecas externas para isto.

Intl.RelativeTimeFormat();

Essa classe facilita a formatação relativa de um determinado tempo. O método format() formata um valor e uma unidade, dependendo da localização instanciada no RelativeTimeFormat().

Intl.ListFormat();

Auxilia na formatação de valores de uma determinada lista. É possível fazer conjunções (e), disjunções (ou).

Funcionalidades disponíveis nas seguintes plataformas:

Top Level await

Essa é uma proposta que ainda está sendo avaliada. A ideia é permitir a execução de funções assíncronas, sem ser encapsulada por outra função assíncrona.

Promise#{allSettled, any}

Mais dois métodos foram adicionados para a classe de Promise. Promise.allSettled() já está implementada no Chrome 76 e no Firefox, quanto ao Promise.any() está em processo de avaliação pelo TC39.

Promise.allSettled();

Esse método executará todas as promises, porém, ele não irá parar o processo mesmo se uma promise for resolvida ou rejeitada. Está implementada no Chrome 76 e no Firefox.

Promise.allSettled(); (Google)

Promise.any();

Esse método retornará a primeira promise resolvida. Caso todas as promises falhem, ele cairá no catch. Ainda está em processo de avaliação pelo TC39.

Promise.any() (Google)

Transmissão oficial:

https://www.youtube.com/watch?v=c0oy0vQKEZE

Conclusão

É importante ressaltar que o JavaScript é indispensável o para desenvolvimento de aplicações de frontend quanto de backend. A sua facilidade de compreensão, possibilita que cada desenvolvedor possa absorver os seus conceitos e entregar seus projetos em um curto espaço de tempo.

Quanto mais integrações e adições aconteçam no JavaScript vanilla, menos burocrático é o processo de compreensão de bibliotecas como o BabelJS. Ainda existem inúmeros planos para melhorias e mudanças na linguagem e sempre vale à pena ficar atento e interagir nos comitês do JavaScript. A comunidade é quem manda!!!

--

--

Lucas Reis
Senior Mega

Full Stack Developer — Passionated for electronic music and everything about technology. (TS ❤, Node.JS ❤, Distributed Systems ❤)