Presentación
JavaScript es un lenguaje de programación dinámico, multiplataforma y multiparadigma que se ha convertido en uno de los pilares del desarrollo Web. Junto a HTML para la estructura y CSS para la presentación, permite hacer una página interactiva, responder a las acciones del usuario, modificar dinámicamente la interfaz, comunicarse con un servidor o construir aplicaciones completas que se ejecutan dentro del navegador.
El lenguaje ya no está limitado al front-end. Entornos como Node.js, Deno o Bun permiten ejecutar JavaScript fuera del navegador para construir servidores, API, herramientas de línea de comandos, scripts de automatización y aplicaciones completas. JavaScript también se utiliza en entornos desktop, móviles, integrados y en determinados pipelines creativos.
El lenguaje estandarizado se denomina oficialmente ECMAScript. El estándar es desarrollado por el comité TC39 de Ecma International y publicado en la especificación ECMA-262. JavaScript designa generalmente el lenguaje tal como lo utilizan los desarrolladores, mientras que ECMAScript describe su especificación normalizada.
La versión anual publicada actualmente es ECMAScript 2026 — ECMA-262, 17.ª edición, aprobada en junio de 2026. El proyecto sigue evolucionando entre dos ediciones anuales: las propuestas que alcanzan la fase final se integran en el borrador vivo de la siguiente especificación.
También es importante distinguir JavaScript del navegador y las Web APIs. Objetos como Array, Map, Promise o Math pertenecen al lenguaje ECMAScript. En cambio, DOM, fetch(), localStorage, Canvas, Web Audio, WebGL o WebGPU son proporcionados por el entorno Web y no forman parte del núcleo del lenguaje.
Esta distinción explica por qué el mismo JavaScript puede ejecutarse en distintos entornos sin tener acceso exactamente a las mismas funciones.
Funcionalidades
Un lenguaje dinámico y multiparadigma
JavaScript es un lenguaje de tipado dinámico.
Una variable no queda asociada definitivamente a un tipo cuando se declara: puede referirse sucesivamente a distintas categorías de valores durante la ejecución del programa.
El lenguaje dispone de varios tipos primitivos, entre ellos:
string;number;bigint;boolean;undefined;symbol;null.
Los objetos constituyen después una categoría fundamental que permite representar estructuras de datos, arrays, funciones, fechas, colecciones u objetos personalizados.
JavaScript puede utilizarse según varios estilos de programación. Admite programación imperativa, funcional y orientada a objetos, con funciones consideradas valores de primera clase.
Esta flexibilidad permite escribir tanto pequeños scripts como grandes aplicaciones, pero exige a cambio convenciones y una arquitectura rigurosa cuando crece la base de código.
Variables, funciones y closures
Las variables modernas se declaran principalmente con let y const.
const impide reasignar la propia variable, mientras que let permite la reasignación. La palabra clave antigua var sigue siendo válida, pero posee reglas de scope diferentes y suele utilizarse menos en JavaScript moderno.
Las funciones ocupan un lugar central en el lenguaje.
Pueden declararse de forma clásica, asignarse a una variable, pasarse como argumentos, devolverse desde otras funciones o escribirse como arrow functions.
JavaScript también admite closures: una función puede conservar acceso a su entorno léxico incluso después de que la función que la creó haya terminado de ejecutarse.
Esta propiedad constituye la base de numerosos patrones utilizados para encapsular estado, crear callbacks, construir funciones configuradas u organizar determinados componentes de una aplicación.
Objetos, prototipos y clases
El sistema de objetos de JavaScript se basa históricamente en prototipos.
Un objeto puede heredar propiedades y métodos de otro objeto mediante una cadena de prototipos.
Desde ECMAScript 2015, las palabras clave class, extends, constructor o super ofrecen una sintaxis más familiar para estructurar programación orientada a objetos.
Las clases JavaScript siguen estando construidas, sin embargo, sobre el sistema de prototipos del lenguaje.
Pueden contener métodos públicos, campos, propiedades privadas con #, getters, setters y métodos estáticos.
Este sistema permite crear jerarquías de objetos clásicas conservando al mismo tiempo la flexibilidad propia de JavaScript.
Arrays, Map, Set y colecciones
JavaScript ofrece varias estructuras integradas para organizar datos.
Array representa una colección ordenada y dispone de numerosos métodos como map(), filter(), reduce(), find(), some() o every().
Map permite asociar claves a valores aceptando prácticamente cualquier tipo de clave.
Set representa una colección de valores únicos.
WeakMap y WeakSet ofrecen variantes cuyas referencias no impiden que determinados objetos sean liberados por el garbage collector.
Estas estructuras permiten cubrir gran parte de las necesidades habituales sin instalar una biblioteca externa.
Promesas, async y await
Gran parte del JavaScript moderno se basa en la programación asíncrona.
Los objetos Promise representan el resultado futuro de una operación que puede completarse correctamente o fallar.
Se utilizan especialmente para comunicaciones de red, acceso a archivos en determinados runtimes, bases de datos u otras operaciones cuya duración no es inmediata.
Las palabras clave async y await ofrecen una sintaxis más legible sobre las promesas.
Una función marcada como async devuelve una promesa. Dentro de ella, await permite suspender su ejecución hasta que otra promesa se resuelva, sin bloquear el programa completo.
JavaScript también ofrece herramientas como:
Promise.all();Promise.allSettled();Promise.race();Promise.any().
Permiten coordinar varias operaciones asíncronas según distintas necesidades.
Sigue siendo importante entender que await no transforma JavaScript en un lenguaje de ejecución síncrona: únicamente suspende la tarea asíncrona correspondiente mientras el entorno puede seguir procesando otras operaciones.
Módulos ES con import y export
JavaScript dispone actualmente de un sistema de módulos estandarizado.
Un archivo puede exponer funciones, clases o valores mediante export, y recuperarlos desde otro lugar con import.
Los módulos permiten dividir una aplicación en componentes independientes en lugar de colocar todo el código dentro de un único script.
Admiten:
- exports nombrados;
- export por defecto;
- reexportación;
- imports dinámicos con
import(); awaiten el nivel superior en determinados módulos;- import maps en entornos Web compatibles.
Los módulos ES están actualmente soportados directamente por los navegadores modernos y los principales runtimes JavaScript.
Los ecosistemas históricos también utilizan otros sistemas, especialmente CommonJS en numerosos proyectos Node.js antiguos.
Iteradores, generadores y bucles modernos
JavaScript dispone de un protocolo de iteración utilizado por varias estructuras del lenguaje.
El bucle for...of permite recorrer los valores de un objeto iterable como un array, una cadena, un Map o un Set.
Los generadores, declarados con function*, pueden suspender y reanudar su ejecución mediante yield.
Permiten producir valores progresivamente en lugar de calcular inmediatamente una colección completa.
También pueden construirse iteradores personalizados implementando los protocolos correspondientes.
Estos mecanismos resultan especialmente útiles para procesar flujos, generar secuencias o construir abstracciones de recorrido reutilizables.
Typed Arrays y manipulación de datos binarios
JavaScript no está limitado a estructuras de alto nivel.
Los Typed Arrays permiten manipular datos binarios brutos dentro de zonas de memoria representadas especialmente por ArrayBuffer o SharedArrayBuffer.
Existen distintas vistas:
Uint8Array;Int16Array;Uint32Array;Float32Array;Float64Array;- y varios tipos adicionales.
Estas estructuras son importantes cuando JavaScript interactúa con audio, vídeo, datos de red, archivos binarios, WebGL, WebGPU o WebAssembly.
Ofrecen mayor control sobre la representación en memoria que los arrays JavaScript tradicionales.
Gestión de errores
JavaScript utiliza principalmente throw, try, catch y finally para gestionar errores.
Una función puede lanzar explícitamente un error y las llamadas de niveles superiores pueden decidir dónde tratarlo.
El lenguaje proporciona distintas clases integradas como:
Error;TypeError;RangeError;ReferenceError;SyntaxError.
También pueden crearse clases de error personalizadas para representar de forma más precisa los problemas específicos de una aplicación.
Con código asíncrono, los errores pueden provocar el rechazo de una Promise y tratarse mediante .catch() o con try...catch alrededor de un await.
JavaScript en el navegador
Dentro de un navegador, JavaScript es ejecutado por un motor JavaScript.
Entre los principales se encuentran:
- V8, utilizado especialmente por Chrome y Chromium;
- SpiderMonkey, utilizado por Firefox;
- JavaScriptCore, utilizado por Safari.
Estos motores implementan el estándar ECMAScript y después el entorno del navegador añade sus propias Web APIs.
JavaScript puede entonces manipular el DOM, reaccionar a eventos, enviar peticiones de red, gestionar almacenamiento local, dibujar con Canvas, generar audio, mostrar 3D mediante WebGL/WebGPU o comunicarse con distintos dispositivos cuando las API correspondientes están disponibles.
Una función como document.querySelector() pertenece por tanto al DOM y no al lenguaje ECMAScript en sí.
JavaScript en servidor y fuera del navegador
JavaScript también puede ejecutarse sin navegador mediante runtimes dedicados.
Node.js popularizó ampliamente JavaScript en el servidor. Permite crear API, sitios dinámicos, servidores en tiempo real, herramientas CLI, scripts de build y automatizaciones.
Otros runtimes como Deno y Bun ofrecen sus propios enfoques utilizando el mismo lenguaje ECMAScript.
Estos entornos añaden capacidades que no existen en el núcleo de JavaScript, especialmente acceso al sistema de archivos, procesos, red de bajo nivel o herramientas del sistema.
Por tanto, un script JavaScript no es automáticamente portable entre todos los entornos: el lenguaje puede ser el mismo, pero las API disponibles pueden cambiar.
npm y un ecosistema de software enorme
El ecosistema JavaScript se apoya en gran medida en gestores de paquetes, especialmente npm.
Un proyecto puede añadir bibliotecas especializadas para interfaces de usuario, servidores, tests, bases de datos, validación, gráficos, inteligencia artificial, procesamiento de archivos o prácticamente cualquier otro ámbito.
Numerosos frameworks y bibliotecas importantes se basan en JavaScript o en su ecosistema:
- React;
- Vue;
- Angular;
- Svelte;
- Next.js;
- Express;
- Three.js;
- Electron;
- React Native.
Esta riqueza constituye una de las principales fortalezas de JavaScript, pero también una posible fuente de complejidad.
Un proyecto moderno puede acumular rápidamente cientos de dependencias transitivas, lo que hace necesarios una buena gestión de versiones, auditorías de seguridad y especial atención al mantenimiento.
TypeScript como extensión tipada del ecosistema
TypeScript no es JavaScript, pero está estrechamente relacionado con su ecosistema.
Añade especialmente un sistema de tipado estático sobre JavaScript y después transforma el código en JavaScript ejecutable.
Puede facilitar el mantenimiento de grandes bases de código gracias a una mejor detección de errores, autocompletado y documentación implícita de las estructuras de datos.
Un desarrollador JavaScript no está obligado a utilizar TypeScript, pero este se ha vuelto muy habitual en grandes proyectos Web, frameworks y bibliotecas.
La comprensión de JavaScript sigue siendo, sin embargo, fundamental: TypeScript termina compilándose a JavaScript y conserva gran parte de su comportamiento durante la ejecución.
Casos de uso
Añadir interactividad a una página Web
JavaScript puede escuchar un clic, validar un formulario, abrir un menú, filtrar resultados o modificar dinámicamente una parte del documento.
El código interactúa entonces principalmente con el DOM y los eventos proporcionados por el navegador.
Para un sitio sencillo, algunos módulos JavaScript pueden ser suficientes sin utilizar un framework completo.
El lenguaje sigue siendo así tan útil para una pequeña mejora de interfaz como para una aplicación compleja.
Construir una aplicación front-end completa
Una aplicación Web puede utilizar JavaScript para gestionar navegación, estado, formularios, datos remotos y actualizaciones de la interfaz.
Frameworks como React, Vue, Angular o Svelte pueden estructurar el proyecto, pero el código ejecutado sigue dependiendo en gran medida de los mecanismos fundamentales del lenguaje.
Promesas, módulos, objetos, arrays, funciones y eventos siguen siendo por tanto esenciales incluso cuando un framework oculta parte de su uso directo.
Desarrollar una API o servidor con Node.js
JavaScript puede utilizarse en el servidor para recibir peticiones HTTP, consultar una base de datos y devolver respuestas a una aplicación cliente.
Este enfoque permite a un equipo compartir el mismo lenguaje entre front-end y back-end.
Los desarrolladores también pueden reutilizar determinadas estructuras de datos, herramientas de validación o tipos entre las distintas partes del proyecto.
El runtime sigue proporcionando las capacidades del servidor: ECMAScript por sí solo no permite abrir un archivo ni escuchar un puerto de red.
Automatizar tareas y crear herramientas CLI
JavaScript puede utilizarse para renombrar archivos, convertir datos, lanzar builds, analizar contenido o automatizar un workflow de desarrollo.
Con Node.js, Deno o Bun, un script puede acceder al sistema de archivos y a numerosas herramientas del sistema.
Este uso es especialmente habitual en pipelines de build front-end donde JavaScript controla bundlers, tests, linters, generadores y herramientas de despliegue.
Crear experiencias gráficas, 3D o interactivas
Mediante las Web APIs y bibliotecas especializadas, JavaScript puede controlar Canvas, WebGL, WebGPU, Web Audio o WebXR.
Three.js, por ejemplo, simplifica la creación de escenas 3D en el navegador, mientras que otras bibliotecas sirven para visualización de datos, animaciones o juegos.
JavaScript se convierte entonces en el lenguaje que organiza la experiencia, mientras que las API gráficas proporcionan acceso a la GPU y a otras capacidades del navegador.