De ES6 a ES2025: La evolución de JavaScript moderno
El lenguaje JavaScript no ha parado de evolucionar desde su gran salto con ES6 en 2015.
Cada año, el comité técnico TC39 publica una nueva versión del estándar ECMAScript, con mejoras que hacen el lenguaje más potente, expresivo y fácil de mantener.
En este artículo repasamos las principales novedades desde ES6 hasta ECMAScript 2025, explicando qué hace cada una y mostrando ejemplos de código reales.
ECMAScript 2015 (ES6): El gran salto
ES6 fue la revolución moderna de JavaScript.
let y const
Permiten definir variables con ámbito de bloque:
for (let i = 0; i < 3; i++) {
console.log(i); // 0,1,2
}
console.log(i); // ❌ Error: i no está definida
Arrow Functions
Simplifican las funciones anónimas:
const saludar = (nombre) => `Hola ${nombre}`;
console.log(saludar("Marta")); // "Hola Marta"
Clases
Una forma más clara de crear objetos con herencia:
class Persona {
constructor(nombre) {
this.nombre = nombre;
}
saludar() {
console.log(`Hola, soy ${this.nombre}`);
}
}
new Persona("Ana").saludar();
Template Strings
Permiten interpolar variables y saltos de línea fácilmente:
const producto = "Ordenador";
const precio = 999;
console.log(`El ${producto} cuesta ${precio}€`);
Destructuring y Spread
Extraer o combinar propiedades:
const user = { nombre: "Carlos", edad: 42 };
const { nombre } = user;
console.log(nombre); // "Carlos"
const extra = { ciudad: "Zaragoza" };
const combinado = { ...user, ...extra };
ECMAScript 2016 (ES7)
Pequeña actualización pero muy útil.
Potenciación con **
console.log(2 ** 3); // 8
Array.includes()
const frutas = ["manzana", "pera"];
console.log(frutas.includes("pera")); // true
ECMAScript 2017 (ES8)
Introdujo async/await, la forma moderna de manejar promesas:
async function obtenerDatos() {
const res = await fetch("https://pokeapi.co/api/v2/pokemon/pikachu");
const data = await res.json();
console.log(data.name);
}
obtenerDatos();
Y métodos prácticos:
const persona = { nombre: "Lucía", edad: 30 };
console.log(Object.entries(persona));
// [['nombre', 'Lucía'], ['edad', 30]]
ECMAScript 2018 (ES9)
Mayor control sobre asincronía y objetos.
for await...of
Permite recorrer promesas asíncronas:
const urls = [
"https://pokeapi.co/api/v2/pokemon/pikachu",
"https://pokeapi.co/api/v2/pokemon/charmander",
];
const promesas = urls.map((url) => fetch(url));
for await (const r of promesas) {
const data = await r.json();
console.log(data.name);
}
ECMAScript 2019 (ES10)
Array.flat()
Aplana arrays anidados:
console.log([1, [2, [3]]].flat(2)); // [1, 2, 3]
Object.fromEntries()
Convierte pares clave-valor en objeto:
console.log(
Object.fromEntries([
["nombre", "Sara"],
["edad", 22],
])
);
ECMAScript 2020 (ES11)
Una versión muy potente.
Optional chaining ?.
Evita errores si algo es undefined:
console.log(usuario?.perfil?.email || "No disponible");
Nullish coalescing ??
Solo usa el valor por defecto si es null o undefined:
const valor = 0 ?? 10; // 0 (no lo sustituye)
BigInt
Para números enormes:
const grande = 999999999999999999999n;
ECMAScript 2021 (ES12)
Promise.any()
Devuelve la primera promesa resuelta:
await Promise.any([fetch("/api1"), fetch("/api2")]);
Operadores lógicos de asignación
let contador = 0;
contador ||= 10; // si es falsy, asigna 10
ECMAScript 2022 (ES13)
Top-level await
Ya no necesitas envolver en una función:
const data = await fetch("https://pokeapi.co/api/v2/pokemon/1").then((r) =>
r.json()
);
console.log(data.name);
Campos privados en clases
class Cuenta {
#saldo = 100;
verSaldo() {
console.log(this.#saldo);
}
}
new Cuenta().verSaldo();
ECMAScript 2023 (ES14)
Nuevos métodos de arrays inmutables
const nums = [3, 1, 2];
console.log(nums.toSorted()); // [1,2,3] sin modificar el original
ECMAScript 2024 (ES15)
Array.groupBy()
Agrupa elementos:
const personas = [{ edad: 20 }, { edad: 30 }, { edad: 20 }];
console.log(Object.groupBy(personas, (p) => p.edad));
ECMAScript 2025 (ES16)
Set avanzado
const a = new Set([1, 2]);
const b = new Set([2, 3]);
console.log(a.union(b)); // Set {1,2,3}
Temporal
API moderna para fechas precisas:
const ahora = Temporal.Now.plainDateTimeISO();
console.log(ahora.toString());
Conclusión
JavaScript ha pasado de ser un lenguaje improvisado a una plataforma sólida y madura. Cada actualización ha hecho el lenguaje más legible, expresivo y potente.
Si ES6 fue el inicio del JavaScript moderno, ECMAScript 2025 representa su madurez total.
Evolución visual de ECMAScript
- 2015 — ES6
Clases, let/const, Promesas, Módulos
- 2017 — ES8
async/await
- 2020 — ES11
Optional chaining, Nullish coalescing
- 2022 — ES13
Top-level await, campos privados
- 2025 — ES16
Temporal, Set avanzado