Guía Completa de ECMAScript

Todo lo que necesitas saber sobre el estándar de JavaScript

¿Qué es ECMAScript?

ECMAScript es el estándar sobre el cual se basa JavaScript. Es una especificación de lenguaje de programación publicada por ECMA International (European Computer Manufacturers Association).

JavaScript es la implementación más popular de ECMAScript, pero no es la única. Otros lenguajes como ActionScript también implementan el estándar ECMAScript.

ECMAScript define:

Los navegadores implementan el motor JavaScript siguiendo esta especificación para garantizar que el código funcione de la misma manera en todos ellos.

¿Cómo utilizar ECMAScript?

Para utilizar ECMAScript en tus proyectos, simplemente escribe código JavaScript siguiendo las características disponibles en la versión que quieras usar.

Consideraciones importantes:

Ejemplo básico de uso

Para usar ECMAScript en un navegador, simplemente incluye un archivo JavaScript o escribe código dentro de etiquetas <script>:

HTML
<!DOCTYPE html>
<html>
<head>
    <title>Mi página con ES6</title>
</head>
<body>
    <script src="app.js"></script>
</body>
</html>

Línea de tiempo de versiones

Junio 1997

ECMAScript 1

Primera edición del estándar ECMAScript. Estableció las bases del lenguaje.

Junio 1998

ECMAScript 2

Pequeñas actualizaciones para alinear el estándar con el estándar ISO/IEC 16262.

Diciembre 1999

ECMAScript 3

Agregó expresiones regulares, manejo de excepciones (try/catch), más métodos para strings y arrays, y otras mejoras.

Julio 2008

ECMAScript 4

Nunca se lanzó oficialmente debido a desacuerdos sobre la dirección del lenguaje. Muchas de sus ideas se incorporaron más tarde en ES6.

Diciembre 2009

ECMAScript 5

Agregó "strict mode", métodos de array como forEach, map, filter, JSON nativo, y otras mejoras.

Junio 2011

ECMAScript 5.1

Pequeñas actualizaciones para alinear con la especificación ISO/IEC 16262:2011.

Junio 2015

ECMAScript 6 (ES2015)

Una gran actualización que agregó clases, módulos, promesas, arrow functions, template strings, let/const, y muchas otras características.

Junio 2016

ECMAScript 2016 (ES7)

Agregó el operador de exponenciación (**) y Array.prototype.includes.

Junio 2017

ECMAScript 2017 (ES8)

Agregó async/await, Object.values/Object.entries, relleno de strings y otras características.

Junio 2018

ECMAScript 2018 (ES9)

Agregó operadores rest/spread para objetos, iteración asíncrona, Promise.finally y otras mejoras.

Junio 2019

ECMAScript 2019 (ES10)

Agregó Array.flat, Array.flatMap, Object.fromEntries, trimStart/trimEnd y otras características.

Junio 2020

ECMAScript 2020 (ES11)

Agregó BigInt, operador de coalescencia nula (??), optional chaining (?.), Promise.allSettled y otras características.

Junio 2021

ECMAScript 2021 (ES12)

Agregó String.replaceAll, operadores lógicos de asignación (&&=, ||=, ??=), Promise.any y otras mejoras.

Junio 2022

ECMAScript 2022 (ES13)

Agregó campos privados en clases, métodos estáticos y privados, operador "in" para verificar propiedades privadas, at() para arrays/strings, y más.

Junio 2023

ECMAScript 2023 (ES14)

Agregó métodos toSorted, toReversed, toSpliced, findLast y findLastIndex para arrays, y otras mejoras.

Diferencias notorias entre versiones

ES5 vs ES6 (ES2015)

ES6 fue un cambio revolucionario que introdujo muchas características nuevas:

ES6 (ES2015) vs ES2016+

Las versiones posteriores a ES6 han sido más incrementales, agregando características específicas:

Ejemplos de características por versión

ECMAScript 5 (2009) ES5

"use strict"

El modo estricto ayuda a capturar errores comunes y acciones inseguras:

JavaScript
"use strict";

x = 3.14; // Lanza un error porque x no está declarado
function withStrictMode() {
    y = 3.14; // También lanza error
}
Métodos de Array

Nuevos métodos para arrays como forEach, map, filter, reduce, etc.

JavaScript
var numbers = [1, 2, 3, 4, 5];

// forEach
numbers.forEach(function(num) {
    console.log(num);
});

// map
var squares = numbers.map(function(num) {
    return num * num;
});

// filter
var evens = numbers.filter(function(num) {
    return num % 2 === 0;
});

ECMAScript 6 (2015) ES6

Arrow Functions

Sintaxis más concisa para funciones y manejo léxico de this.

JavaScript
// ES5
var multiply = function(a, b) {
    return a * b;
};

// ES6
const multiply = (a, b) => a * b;

// Con this léxico
function Person() {
    this.age = 0;
    
    // ES5 necesitaba bind(this) o var self = this
    setInterval(() => {
        this.age++; // this se refiere al objeto Person
    }, 1000);
}
Template Literals

Interpolación de strings y strings multilínea.

JavaScript
const name = "Alice";
const age = 28;

// ES5
console.log("Hola " + name + ", tienes " + age + " años.");

// ES6
console.log(`Hola ${name}, tienes ${age} años.`);

// Multilínea
const message = `
  Hola ${name},
  
  Gracias por unirte a nuestro servicio.
  Tu edad registrada es: ${age}.
  
  Saludos,
  El equipo
`;

ECMAScript 2016 (ES7) ES7

Operador de exponenciación

Nuevo operador para cálculos exponenciales.

JavaScript
// ES5
Math.pow(2, 3); // 8

// ES7
2 ** 3; // 8

// También funciona con asignación
let num = 2;
num **= 3; // num ahora es 8
Array.prototype.includes

Método más legible para verificar si un array contiene un elemento.

JavaScript
const colors = ['red', 'green', 'blue'];

// ES5
if (colors.indexOf('green') !== -1) {
    console.log('Tiene verde');
}

// ES7
if (colors.includes('green')) {
    console.log('Tiene verde');
}

ECMAScript 2017 (ES8) ES8

Async/Await

Sintaxis más limpia para trabajar con promesas.

JavaScript
// ES6 con Promesas
function fetchData() {
    return fetch('https://api.example.com/data')
        .then(response => response.json())
        .then(data => console.log(data))
        .catch(error => console.error(error));
}

// ES8 con async/await
async function fetchData() {
    try {
        const response = await fetch('https://api.example.com/data');
        const data = await response.json();
        console.log(data);
    } catch (error) {
        console.error(error);
    }
}

ECMAScript 2020 (ES11) ES11

Optional Chaining

Acceso seguro a propiedades anidadas sin errores si una intermedia es null/undefined.

JavaScript
const user = {
    profile: {
        name: "Alice",
        address: {
            city: "Madrid"
        }
    }
};

// ES5
const city = user && user.profile && user.profile.address && user.profile.address.city;

// ES2020
const city = user?.profile?.address?.city;
Nullish Coalescing

Operador para valores por defecto que solo considera null/undefined (no otros falsy values).

JavaScript
// ES5
const value = settings.option || 'default';

// Problema: si option es 0 o '', igual usa 'default'

// ES2020
const value = settings.option ?? 'default';
// Solo usa 'default' si option es null o undefined

ECMAScript 2022 (ES13) ES13

Campos y métodos privados en clases

Sintaxis para declarar miembros privados en clases usando #.

JavaScript
class Counter {
    #count = 0; // Campo privado
    
    #increment() { // Método privado
        this.#count++;
    }
    
    get value() {
        return this.#count;
    }
    
    tick() {
        this.#increment();
    }
}

const counter = new Counter();
counter.tick();
console.log(counter.value); // 1
console.log(counter.#count); // Error: campo privado

Conclusión

ECMAScript es el estándar que impulsa JavaScript, y su evolución ha transformado el lenguaje de una herramienta simple para interactuar con páginas web a un lenguaje de programación completo y robusto.

Desde ES6 (2015), JavaScript ha experimentado una rápida evolución con nuevas características que mejoran la legibilidad, mantenibilidad y capacidad del código. Las versiones recientes siguen añadiendo funcionalidades útiles mientras mantienen la compatibilidad hacia atrás.

Para los desarrolladores, es importante:

El futuro de ECMAScript sigue brillante, con propuestas activas para nuevas características que continuarán mejorando el lenguaje en los próximos años.