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

  • 2015ES6

    Clases, let/const, Promesas, Módulos

  • 2017ES8

    async/await

  • 2020ES11

    Optional chaining, Nullish coalescing

  • 2022ES13

    Top-level await, campos privados

  • 2025ES16

    Temporal, Set avanzado



Usamos cookies para mejorar tu experiencia. ¿Aceptas las cookies de análisis?