Skip to content
tutorials

O seu JavaScript está obsoleto.

A linguagem está evoluindo mais rápido do que você imagina, deixando para trás padrões comuns e soluções alternativas. Você provavelmente ainda usa hacks para problemas que o JavaScript resolveu há anos — ou até meses.

Dani Roth
O seu JavaScript está obsoleto.

As novas regras da imutabilidade de arrays

O JavaScript moderno exige imutabilidade, especialmente em frameworks como React que dependem de referências de estado estáveis. Mutar um array diretamente com métodos como sort() ou reverse() quebra esse contrato, levando a atualizações de UI imprevisíveis e efeitos colaterais difíceis de depurar. Esses métodos tradicionais modificam o array original no local, um anti-pattern crítico para um gerenciamento de estado robusto e sustentável.

Resolva este problema com novas contrapartes imutáveis. O ECMAScript 2023 (ES14) introduziu toSorted() e toReversed(), que retornam um novo array com as alterações, deixando o array original intacto. Isso elimina efeitos colaterais indesejados, simplificando atualizações de estado e garantindo re-renders de componentes previsíveis em toda a sua aplicação.

Aprimore ainda mais a imutabilidade de arrays com with(index, value). Este método substitui de forma limpa um elemento em um índice específico, retornando um novo array sem mutar o original. Ele oferece uma alternativa clara e declarativa às chamadas complicadas de splice() ou atribuições diretas arr[i] = val, promovendo um estilo de codificação mais funcional e menos propenso a erros.

Adote esses métodos indispensáveis agora. Eles foram lançados como parte do ECMAScript 2023 (ES14) e são totalmente suportados em runtimes modernos, incluindo Chrome 110+, Firefox 115+, Safari 16+ e Node.js 20+. Atualize suas operações de array para o desenvolvimento JavaScript moderno.

JSON.stringify morreu para clonagem

Abandone o hack de clonagem profunda JSON.parse(JSON.stringify(obj)) imediatamente. Este método falha notoriamente em tipos de dados complexos, convertendo objetos Date em meras strings e descartando completamente dados Map e Set, deixando-os como objetos vazios. Além disso, ele não consegue lidar com funções, undefined, Infinity, NaN ou objetos com referências circulares, causando perda silenciosa de dados ou erros em tempo de execução.

Em vez disso, adote o structuredClone(), a API moderna e nativa. Esta solução definitiva copia fielmente uma ampla gama de tipos de dados complexos, incluindo Map, Set, Date, RegExp, ArrayBuffer, Blob e até mesmo ImageData. Crucialmente, o structuredClone() também navega e duplica objetos que contêm grafos circulares, fornecendo cópias profundas robustas sem bibliotecas externas ou lógica de serialização personalizada.

Embora poderoso, o structuredClone() tem limitações menores e específicas: ele não pode clonar funções, nós DOM ou propriedades com getters/setters personalizados. No entanto, para a grande maioria dos dados de aplicação, ele fornece um clone completo e que preserva o tipo. Faça do structuredClone() seu padrão preferencial para 99% dos casos de uso de clonagem profunda no JavaScript moderno, garantindo integridade de dados e estado previsível.

O padrão de Promise que você estava esperando

Resolva promises a partir de um escopo externo sem o boilerplate. Historicamente, gerenciar a resolução de uma Promise fora do seu construtor significava declarar variáveis resolve e reject com antecedência. Este padrão, que requer atribuições de variáveis externas, polui o código e torna o controle da promise opaco.

Observe o padrão legado comum:

let externalResolve, externalReject;
const externalPromise = new Promise((resolve, reject) => { externalResolve = resolve; externalReject = reject;
});
// Mais tarde no seu código...
externalResolve('Dados recebidos!');

Esta abordagem força você a expor funções internas da promise globalmente ou em um escopo mais amplo, aumentando o potencial de uso indevido e tornando o fluxo de controle mais difícil de rastrear.

Conheça o Promise.withResolvers(), um novo método estático que simplifica isso imensamente. Introduzido no ECMAScript 2024, ele retorna um objeto contendo a promise, sua função resolve e sua função reject. Chega de pré-declarações ou vazamento de escopo.

Implemente Promise.withResolvers():

const { promise, resolve, reject } = Promise.withResolvers();
// ... agora 'promise' pode ser retornada, e 'resolve'/'reject' chamados em outro lugar.
resolve('Operação concluída.');

Este método limpa drasticamente padrões assíncronos onde uma promise deve aguardar um gatilho externo, como um usuário clicando em um botão ou uma mensagem WebSocket recebida. Ele está disponível no Chrome 120+, Firefox 121+ e Node.js 21+. Para mais detalhes fundamentais sobre JavaScript e sintaxe em evolução, consulte recursos como Lexical grammar - JavaScript - MDN Web Docs. Adote o JavaScript moderno para um controle assíncrono mais limpo e robusto.

Gostando do artigo? Receba um assim na sua caixa de entrada toda manhã.

um e-mail por dia · cancele em dois cliques · sem rastreadores de terceiros

Segredos de sintaxe escondidos à vista de todos

Melhore a legibilidade de números usando numeric separators, um recurso do ES2021. Esclareça instantaneamente literais grandes como 1_000_000_000 em comparação com 1000000000. Esta sintaxe funciona para qualquer base numérica—decimal, binária, octal, hexadecimal e BigInts—adicionando zero sobrecarga de desempenho. Underscores não podem aparecer no início, no fim ou ao lado de um ponto decimal, nem dois podem estar seguidos. Crucialmente, esta é uma separação visual apenas no código; o parsing de strings falha, pois Number('1_000') retorna NaN e parseInt('1_000') resulta em 1.

Assuma o controle explícito sobre loops aninhados com labeled statements. Declare myLoop: for (...) para atribuir um rótulo a um loop externo. De dentro de qualquer loop interno, break myLoop; sai de toda a estrutura rotulada em um único passo explícito. Esta alternativa limpa elimina variáveis de flag repetitivas para cenários complexos de fluxo de controle, melhorando significativamente a clareza do código e reduzindo possíveis erros por quebras esquecidas.

Estes não são truques obscuros da linguagem para concursos de curiosidades. Aproveite os numeric separators e labeled statements como ferramentas práticas para escrever código autodocumentado e sustentável. Foque na ergonomia e clareza do desenvolvedor, tornando sua base de código JavaScript imediatamente mais compreensível, robusta e fácil de entender para futuros colaboradores.

Perguntas Frequentes

Por que métodos de array imutáveis como toSorted() são importantes?

Eles evitam efeitos colaterais acidentais ao retornar um novo array em vez de modificar o original. Isso é crucial para um gerenciamento de estado previsível em frameworks modernos como o React, que dependem da imutabilidade para detectar alterações.

Quando devo usar structuredClone() em vez do hack JSON.stringify?

Quase sempre. O structuredClone() é uma API nativa e robusta que lida corretamente com tipos de dados complexos como Dates, Maps, Sets e até referências circulares. O hack do JSON quebra esses tipos e deve ser considerado um anti-padrão legado.

O Promise.withResolvers() está disponível em todos os lugares?

Não, é um recurso muito recente do ECMAScript 2024. Ele é suportado nas versões mais recentes dos principais navegadores (como Chrome 119+) e Node.js (v22+). Sempre verifique as tabelas de compatibilidade se precisar oferecer suporte a ambientes mais antigos.

Numeric separators podem ser usados ao fazer o parsing de strings?

Não. Numeric separators são um recurso apenas para literais numéricos no seu código-fonte. Tentar fazer o parsing de uma string contendo um underscore com Number('1_000') ou parseInt('1_000') resultará em NaN ou em um valor incorreto.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only