JavaScript em 2025: o que há de novo?
O ecossistema JavaScript continua a evoluir rapidamente. O ano de 2025 trouxe aos desenvolvedores atualizações tão esperadas e novos recursos que tornam a linguagem ainda mais poderosa e conveniente. Neste artigo, analisaremos as principais inovações que já estão disponíveis ou surgirão em breve, com foco na aplicação prática no ambiente Node.js.
1. Temporal API: uma nova era para trabalhar com datas
Uma das inovações mais significativas de 2025 foi a Temporal API — uma substituição moderna para o obsoleto objeto Date. O Temporal resolve problemas antigos com mutabilidade, fusos horários e análise de datas.
Principais recursos do Temporal:
- Imutabilidade — todas as operações retornam um novo objeto.
- Suporte a fusos horários e calendários (incluindo não gregorianos).
- Precisão de nanossegundos.
- Métodos convenientes para comparação, formatação e cálculos.
Exemplo de uso no Node.js:
// Criando a data e hora atuais em UTCconst now = Temporal.Now.instant();console.log(now.toString()); // "2025-06-10T12:30:00.123456789Z"
// Trabalhando com data sem horaconst date = Temporal.PlainDate.from("2025-12-25");console.log(date.dayOfWeek); // 4 (quinta-feira)
// Adicionando mesesconst futureDate = date.add({ months: 3 });console.log(futureDate.toString()); // "2026-03-25"
// Diferença entre datasconst start = Temporal.PlainDate.from("2025-01-01");const end = Temporal.PlainDate.from("2025-12-31");const duration = start.until(end);console.log(duration.total("days")); // 3642. Decoradores (Estágio 3 → Estágio 4)
Após anos de discussão, os decoradores finalmente atingiram o estágio final de adoção no ECMAScript. Em 2025, eles se tornam uma parte completa da linguagem, o que é especialmente importante para frameworks (NestJS, Angular) e bibliotecas.
Os decoradores permitem adicionar metadados e alterar o comportamento de classes, métodos e propriedades sem modificar seu código.
Exemplo com Node.js e sintaxe semelhante ao TypeScript (já suportada em modo experimental):
// Decorador para registrar a chamada de métodofunction log(target, context) { const methodName = context.name; const originalMethod = target;
return function (...args) { console.log(`[LOG] Chamada de ${methodName} com argumentos:`, args); const result = originalMethod.apply(this, args); console.log(`[LOG] Resultado de ${methodName}:`, result); return result; };}
class Calculator { @log add(a, b) { return a + b; }}
const calc = new Calculator();calc.add(5, 7);// [LOG] Chamada de add com argumentos: [5, 7]// [LOG] Resultado de add: 123. Pattern Matching — fase experimental
Em 2025, o pattern matching está sendo ativamente discutido e implementado em modo experimental — uma construção poderosa, familiar para desenvolvedores em Rust, Haskell ou Scala. Ele permite lidar elegantemente com condições complexas.
Sintaxe da proposta (ainda pode mudar):
// Exemplo de pattern matching para processar status HTTPfunction handleResponse(status) { match (status) { when (200) -> console.log("Sucesso"); when (201) -> console.log("Criado"); when (400, 401, 403) -> console.log("Erro do cliente"); when (500..599) -> console.log("Erro do servidor"); default -> console.log("Status desconhecido"); }}
// Desestruturação de objetosfunction processUser(user) { match (user) { when ({ role: "admin", permissions: { write: true } }) -> console.log("Admin com permissão de escrita"); when ({ role: "user", age: < 18 }) -> console.log("Menor de idade"); }}