Novos recursos esperados de JavaScript que você deve conhecer

Desde o lançamento do padrão ECMAScript 2015 (também chamado ES6), o JavaScript mudou e melhorou seriamente. Esta é uma notícia muito boa para todos os desenvolvedores de JS. Além disso, agora uma nova versão do ECMAScript é lançada todos os anos. Talvez você não tenha prestado muita atenção ao que apareceu na versão mais recente do padrão, lançada em junho de 2019. O autor do artigo, cuja tradução estamos publicando hoje, quer falar em poucas palavras sobre as inovações do JavaScript e sobre o que pode ser esperado na próxima versão do padrão ECMAScript.



As oportunidades cujas propostas estão na terceira etapa de aprovação (Etapa 3) serão mencionadas aqui. Isso significa que eles provavelmente aparecerão na próxima versão do padrão ECMAScript, mas isso não pode ser confirmado com certeza absoluta. Aqui está um repositório onde você pode encontrar informações sobre propostas que estão em diferentes estágios de aprovação.

Recursos ECMAScript 2019 (ES10)


O padrão ES10 possui muitos recursos novos. Aqui vamos considerar apenas alguns deles. Ou seja, alguns novos métodos de matriz.

▍ Método Array.prototype.flat


Este método permite criar matrizes, que incluem outras matrizes, mais "planas", "compactando" para um determinado nível de profundidade.

const array = [1, 2, [3, 4]]; array.flat(); // [1, 2, 3, 4]; 

Esse é um recurso muito útil, especialmente nos casos em que você precisa trabalhar com matrizes aninhadas. Se a profundidade de aninhamento de matrizes na estrutura de dados exceder 1, uma única chamada para o método flat não poderá tornar a matriz completamente "plana". Esse método aceita uma depth parâmetro opcional, que permite especificar quantos níveis de aninhamento a dimensão da matriz processada deve ser reduzida.

 //   const crazyArray = [1, 2, [3, 4], [[5], [6, [7,8]]]]; crazyArray.flat(Infinity); // [1, 2, 3, 4, 5, 6, 7, 8]; // ,  flat,     

Quanto mais profunda a matriz, mais recursos de computação serão necessários para processá-la. Observe que o IE e o Edge não suportam esse recurso.

Método Array.prototype.flatMap


Esse método primeiro processa os elementos da matriz usando a função passada a ela e depois converte a matriz em uma estrutura plana.

 const arr = ["it's Sunny in", "", "California"]; arr.flatMap(x => x.split(" ")); // ["it's","Sunny","in", "", "California"] 

A diferença entre flatMap e flatMap é que você pode passar sua própria função para o método flatMap que converte os elementos da matriz original. Além disso, o flatMap , ao contrário do flat , "eleva" os elementos das matrizes em apenas 1 nível. Este método retorna uma nova matriz. Pode ser útil nesses casos quando, antes de você tornar uma certa matriz "plana", você precisa de alguma forma processar seus elementos.

Novos recursos de JS na aprovação do estágio 3


No terceiro estágio da coordenação, há muitas novas propostas interessantes para expandir e melhorar o idioma. Vamos considerar alguns deles.

▍ Separadores de dígitos numéricos


Aconteceu com você: escreva um número longo em uma variável e duvide da ortografia correta? A sentença em questão permite separar os bits dos números com sublinhados. Isso facilita o trabalho com números.

 1_000_000_000      // ,   101_475_938.38     //     -     let fee = 123_00;    // $123 (, , 12300 ) let fee = 12_300;    // $12,300 (  !) let amount = 12345_00; // 12,345 (,  , 1234500 ) let amount = 123_45.00; // 12345 (, -  ) let amount = 1_234_500; // 1,234,500 let budget = 1_000_000_000_000; //   `budget`?  - 1 ! // // : console.log(budget === 10 ** 12); // true 

Cada desenvolvedor, depois de aceitar esse recurso, decidirá por si próprio se deve usar separadores de descarga ou não. Mas uma coisa é certa: esse recurso pode reduzir os inconvenientes associados ao cálculo dos dígitos de grandes números.

SingUsando aguardar no nível superior do código


O uso da palavra-chave await no nível superior do código permite que os módulos atuem como grandes funções assíncronas. Devido a esse recurso, os módulos ECMAScript podem esperar que alguns recursos apareçam. Isso leva ao fato de outros módulos importá-los esperarão até que o corpo dos módulos importados esteja pronto para o trabalho.

O motivo desse recurso é que, quando um módulo é importado e possui uma função declarada com a async , a saída dessa função é undefined .

O exemplo a seguir mostra dois arquivos. Pode ficar undefined na output se a função for chamada antes que as tarefas representadas pelas promessas sejam concluídas.

 // awaiting.mjs import { process } from "./some-module.mjs"; const dynamic = import(computedModuleSpecifier); const data = fetch(url); export const output = process((await dynamic).default, await data); // usage.mjs import { output } from "./awaiting.mjs"; export function outputPlusValue(value) { return output + value } console.log(outputPlusValue(100)); setTimeout(() => console.log(outputPlusValue(100), 1000); 

Tudo será interrompido no awaiting.js até que as awaiting.js sejam resolvidas no awaiting.js .

PerOperador ?? e verificando valores apenas em nulos e indefinidos


Talvez, entre todas as ofertas do Estágio 3, essa seja a mais útil. Muitas vezes temos que escrever algo como isto:

 const obj = {  name: 'James' }; const name = obj.name || 'Jane'; // James 

Se obj.name for representado por algum valor falso, a sequência Jane obj.name em name . Como resultado, o name não será algo como undefined . Mas o problema é que uma string vazia neste caso será percebida como um valor falso. Se isso for levado em consideração, esse código deverá ser reescrito da seguinte maneira:

 const name = (obj.name && obj.name !== '') || 'Jane'; 

É inconveniente escrever assim o tempo todo. Operador ?? (dois pontos de interrogação) permite verificar apenas valores null e undefined :

 const response = {  settings: {    nullValue: null,    height: 400,    animationDuration: 0,    headerText: '',    showSplashScreen: false  } }; const undefinedValue = response.settings.undefinedValue ?? 'some other default'; // : 'some other default' const nullValue = response.settings.nullValue ?? 'some other default'; // : 'some other default' const headerText = response.settings.headerText ?? 'Hello, world!'; // : '' const animationDuration = response.settings.animationDuration ?? 300; // : 0 const showSplashScreen = response.settings.showSplashScreen ?? true; // : false 

Operador? e cadeias opcionais


Essa sugestão está próxima da revisada, combinando verificações null e undefined . É sabido que os usuários do TypeScript estão interessados nesse recurso.
Considere um exemplo:

 const city = country && country.city; // undefined  city   

Para chegar à propriedade da city de um objeto do country , é necessário verificar a existência do objeto do country e a existência da propriedade da city .

Usando o operador ?. (ponto de interrogação e período), este código pode ser convertido da seguinte forma:

 const city = country?.city; // undefined  city   

Esse recurso parece útil em tais situações:

 import { fetch } from '../yourFetch.js'; (async () => {  const res = await fetch();  // res && res.data && res.data.cities || undefined  const cities = res?.data?.cities; })(); 

▍ Método Promise.any


O método Promise.any aceita um objeto Promise.any contém objetos de promessa e retorna uma promessa que é resolvida com êxito quando pelo menos um dos objetos de promessa passados ​​para ele é resolvido com êxito. Se todos os objetos da promessa forem rejeitados, ele retornará uma matriz contendo informações sobre os motivos da rejeição.

É assim que o uso do Promise.any com a construção assíncrona / Promise.any parece com:

 try {  const first = await Promise.any(promises);  //      . } catch (error) {  //    . } 

Aqui está a mesma coisa implementada usando promessas:

 Promise.any(promises).then(  (first) => {    //      .  },  (error) => {    //    .  } ); 

O JavaScript já possui os Promise.all , .allSettled , .race , mas um método semelhante. any , não era. Como resultado, temos uma nova oportunidade que complementa as existentes e pode ser útil em determinadas situações. Apesar de a proposta já estar no terceiro estágio de aprovação, ela não pode ser incluída na próxima edição do padrão ECMAScript, pois requer testes adicionais.

Sumário


Há muitas sugestões interessantes para o desenvolvimento de JavaScript que estão no terceiro estágio de aprovação. Será interessante vê-los nos padrões ES11 e ES12. Obviamente, é improvável que alguém os use todos, mas alguns deles definitivamente encontrarão aplicativos amplos e contribuirão para o crescimento da qualidade do código JS.

Caros leitores! Você já está usando algum recurso JavaScript que está quase pronto para ser incluído na próxima versão do padrão?


Source: https://habr.com/ru/post/pt475244/


All Articles