O JavaScript evoluiu imensamente desde o ES6 (2015). Cada ano traz novas funcionalidades que tornam o código mais conciso, legível e poderoso. Este guia aborda os recursos ES6+ mais importantes que todo desenvolvedor deve usar diariamente — desde o básico, como arrow functions, até adições mais recentes como optional chaining e a keyword using.
let & const (ES6)
Escopo de Bloco
// const para valores que nunca mudam (a maioria das variáveis)
const URL_API = "https://api.exemplo.com";
const usuarios = []; // O array é const, mas seu conteúdo pode mudar
usuarios.push("Alice"); // ✅ Ok
// let para valores que mudam
let contador = 0;
contador++;
// ❌ Nunca use var — ela tem escopo de função, não de bloco.
Arrow Functions (ES6)
Arrow Functions
// Função tradicional
function somar(a, b) { return a + b; }
// Arrow function
const somar = (a, b) => a + b;
// Parâmetro único — parênteses opcionais
const dobrar = n => n * 2;
// Múltiplas linhas — precisa de chaves e retorno explícito
const processarUsuario = (usuario) => {
const nome = usuario.nome.trim();
return { ...usuario, nome };
};
// Ótimo para callbacks
const pares = numeros.filter(n => n % 2 === 0);
const nomes = usuarios.map(u => u.nome);
Destructuring (ES6)
Desestruturação de Objetos e Arrays
// Desestruturação de objetos
const { nome, email, nivel = "leitor" } = usuario;
// Renomeando variáveis
const { nome: nomeUsuario, email: emailUsuario } = usuario;
// Desestruturação aninhada
const { endereco: { cidade, pais } } = usuario;
// Desestruturação de arrays
const [primeiro, segundo, ...resto] = [1, 2, 3, 4, 5];
// primeiro = 1, segundo = 2, resto = [3, 4, 5]
// Trocando variáveis
let a = 1, b = 2;
[a, b] = [b, a]; // a = 2, b = 1
// Parâmetros de função
function saudar({ nome, idade }) {
return `Olá ${nome}, você tem ${idade} anos`;
}
Operadores Spread & Rest (ES6)
Spread & Rest
// Spread — expande arrays/objetos
const mesclado = [...arr1, ...arr2];
const copia = { ...objetoOriginal, nome: "Novo Nome" };
// Rest — coleta argumentos restantes
function somar(...numeros) {
return numeros.reduce((a, b) => a + b, 0);
}
somar(1, 2, 3, 4); // 10
Template Literals (ES6)
Template Literals
const nome = "Alice";
const saudacao = `Olá, ${nome}!`;
// Strings de múltiplas linhas
const html = `
<div class="card">
<h2>${titulo}</h2>
<p>${descricao}</p>
</div>
`;
// Tagged templates
function destacar(strings, ...valores) {
return strings.reduce((resultado, str, i) =>
`${resultado}${str}<mark>${valores[i] || ''}</mark>`, '');
}
Optional Chaining & Nullish Coalescing (ES2020)
?. e ??
// Optional chaining — acessa propriedades aninhadas com segurança const cidade = usuario?.endereco?.cidade; // undefined se qualquer um for null/undefined const primeiro = usuarios?.[0]?.nome; // Acesso a array const resultado = usuario?.getProfile?.(); // Chamada de método // Nullish coalescing — valor padrão para null/undefined APENAS const porta = config.porta ?? 3000; // Usa 3000 apenas se porta for null/undefined const nome = usuario.nome ?? "Anônimo"; // Comparar com || (que também pega 0, "", false) const contagem = data.contagem || 10; // ⚠️ Se contagem for 0, isso retorna 10! const contagem = data.contagem ?? 10; // ✅ Só retorna 10 se contagem for null/undefined
Shorthand de Propriedades & Propriedades Computadas (ES6)
Melhorias de Objetos
const nome = "Alice";
const idade = 30;
// Shorthand de propriedade
const usuario = { nome, idade }; // o mesmo que { nome: nome, idade: idade }
// Shorthand de método
const api = {
async obterUsuario(id) { /* ... */ },
async criarUsuario(dados) { /* ... */ },
};
// Nomes de propriedades computadas
const campo = "email";
const obj = { [campo]: "[email protected]" };
// { email: "[email protected]" }
Módulos: import/export (ES6)
Módulos ES
// Exportações nomeadas
export const URL_API = "https://api.exemplo.com";
export function buscarUsuario(id) { /* ... */ }
// Exportação padrão
export default class ServicoUsuario { /* ... */ }
// Importações nomeadas
import { URL_API, buscarUsuario } from './api.js';
// Importação padrão
import ServicoUsuario from './ServicoUsuario.js';
// Renomeando na importação
import { buscarUsuario as obterUsuario } from './api.js';
// Importação dinâmica (lazy loading)
const { Grafico } = await import('./grafico.js');
Novos Recursos Que Valem a Pena Conhecer
structuredClone()(ES2022): Clona objetos profundamente sem os truques deJSON.parse(JSON.stringify()).Array.at()(ES2022):arr.at(-1)para obter o último elemento.Object.groupBy()(ES2024): Agrupa itens de um array por uma função chave.awaitde nível superior (ES2022): Useawaitfora de funções async em módulos ES.
Experimente Nossas Ferramentas JavaScript Gratuitas
Minifique e formate seu JavaScript instantaneamente.