Curso de programación con JavaScript
JavaScript es el lenguaje fundamental para el desarrollo web interactivo. Aprende a crear aplicaciones web dinámicas y responsivas con JavaScript.
JavaScript es el lenguaje de programación fundamental para el desarrollo web, que permite crear experiencias interactivas y dinámicas tanto en el navegador como en el servidor. Desde su creación en 1995, ha evolucionado hasta convertirse en uno de los lenguajes más utilizados y versátiles del mundo de la programación.
Características fundamentales de JavaScript
JavaScript es un lenguaje interpretado que se ejecuta directamente en el navegador sin necesidad de compilación previa. Esta característica lo convierte en una herramienta inmediata y accesible para cualquier desarrollador que quiera comenzar a programar.
El lenguaje presenta un tipado dinámico, lo que significa que las variables pueden cambiar de tipo durante la ejecución del programa. Esta flexibilidad permite un desarrollo más ágil, aunque requiere una comprensión sólida de cómo funcionan los tipos de datos para evitar errores comunes.
Una de las características más distintivas de JavaScript es su naturaleza asíncrona. El lenguaje está diseñado para manejar operaciones que no bloquean la ejecución del programa, como peticiones a servidores o interacciones del usuario, mediante un sistema de eventos y callbacks que veremos en profundidad.
Sintaxis y fundamentos del lenguaje
La sintaxis de JavaScript combina elementos familiares de lenguajes como C y Java con características únicas que lo hacen especialmente adecuado para el desarrollo web. Los desarrolladores trabajarán con diferentes tipos de datos primitivos como números, cadenas de texto, booleanos y valores especiales como null
y undefined
.
Las variables en JavaScript pueden declararse usando var
, let
o const
, cada una con diferentes reglas de alcance y mutabilidad. Esta variedad de declaraciones permite un control preciso sobre cómo se comportan los datos en diferentes contextos del programa.
Los operadores van desde los aritméticos básicos hasta operadores avanzados como el operador de coalescencia nula (??
) o el encadenamiento opcional (?.
), que proporcionan herramientas modernas para escribir código más robusto y expresivo.
// Ejemplo de sintaxis básica
let nombre = "JavaScript";
const version = 2024;
let esModerno = true;
// Operador de encadenamiento opcional
let usuario = {
perfil: {
nombre: "Ana"
}
};
console.log(usuario.perfil?.nombre); // "Ana"
console.log(usuario.configuracion?.tema); // undefined (sin error)
Estructuras de control y funciones
Las estructuras de control en JavaScript incluyen condicionales (if
, switch
) y bucles (for
, while
, do-while
) que permiten controlar el flujo de ejecución del programa. Estas estructuras son fundamentales para implementar lógica compleja y tomar decisiones basadas en datos.
Las funciones son elementos centrales en JavaScript, ya que el lenguaje trata las funciones como ciudadanos de primera clase. Esto significa que pueden asignarse a variables, pasarse como argumentos y retornarse desde otras funciones, abriendo las puertas a patrones de programación avanzados.
Un concepto único de JavaScript son los closures o funciones de cierre, que permiten que una función acceda a variables de su ámbito exterior incluso después de que ese ámbito haya terminado su ejecución. Este mecanismo es fundamental para muchos patrones de diseño en JavaScript.
// Ejemplo de closure
function crearContador() {
let contador = 0;
return function() {
contador++;
return contador;
};
}
const miContador = crearContador();
console.log(miContador()); // 1
console.log(miContador()); // 2
Estructuras de datos nativas
JavaScript proporciona estructuras de datos nativas que van más allá de los tipos primitivos. Los arrays son colecciones ordenadas que incluyen métodos integrados para manipulación, filtrado y transformación de datos.
Los conjuntos (Set) permiten almacenar valores únicos, eliminando automáticamente duplicados, mientras que los mapas (Map) ofrecen una alternativa a los objetos tradicionales para almacenar pares clave-valor con mayor flexibilidad en los tipos de claves.
// Estructuras de datos modernas
const numeros = [1, 2, 3, 4, 5];
const numerosUnicos = new Set([1, 2, 2, 3, 3, 4]);
const configuracion = new Map([
['tema', 'oscuro'],
['idioma', 'es'],
[42, 'respuesta']
]);
console.log(numerosUnicos); // Set {1, 2, 3, 4}
console.log(configuracion.get('tema')); // "oscuro"
Paradigma de programación funcional
JavaScript abraza la programación funcional a través de características como las funciones flecha, que proporcionan una sintaxis más concisa para definir funciones, especialmente útiles en operaciones de transformación de datos.
Los métodos como **filter()**
, **map()**
y **reduce()**
permiten procesar colecciones de datos de manera declarativa, enfocándose en qué se quiere lograr en lugar de cómo hacerlo paso a paso.
La inmutabilidad es un principio clave en la programación funcional que JavaScript puede adoptar, evitando modificar datos existentes y creando nuevas estructuras en su lugar, lo que resulta en código más predecible y fácil de depurar.
// Programación funcional en acción
const productos = [
{ nombre: 'Laptop', precio: 1200, categoria: 'tecnologia' },
{ nombre: 'Libro', precio: 25, categoria: 'educacion' },
{ nombre: 'Mouse', precio: 30, categoria: 'tecnologia' }
];
const tecnologiaCaros = productos
.filter(producto => producto.categoria === 'tecnologia')
.filter(producto => producto.precio > 50)
.map(producto => producto.nombre);
console.log(tecnologiaCaros); // ['Laptop']
Programación orientada a objetos
JavaScript implementa la programación orientada a objetos de manera única a través de prototipos, aunque las versiones modernas también incluyen sintaxis de clases más familiar para desarrolladores de otros lenguajes.
Los prototipos forman una cadena que permite la herencia de propiedades y métodos, mientras que las clases proporcionan una sintaxis más clara para definir constructores y métodos.
El concepto de **this**
en JavaScript es contextual y puede cambiar dependiendo de cómo se invoque una función, lo que requiere comprensión para evitar comportamientos inesperados.
// Clases modernas en JavaScript
class Vehiculo {
constructor(marca, modelo) {
this.marca = marca;
this.modelo = modelo;
}
obtenerInfo() {
return `${this.marca} ${this.modelo}`;
}
}
class Coche extends Vehiculo {
constructor(marca, modelo, puertas) {
super(marca, modelo);
this.puertas = puertas;
}
obtenerInfo() {
return `${super.obtenerInfo()} - ${this.puertas} puertas`;
}
}
Manipulación del DOM
El Document Object Model (DOM) es la representación en memoria de la estructura HTML de una página web. JavaScript puede interactuar con el DOM para seleccionar elementos, modificar contenido, cambiar estilos y responder a eventos del usuario.
La manipulación del DOM es lo que permite crear interfaces interactivas, desde simples validaciones de formularios hasta aplicaciones web complejas que responden en tiempo real a las acciones del usuario.
El almacenamiento local (localStorage
y sessionStorage
) permite persistir datos en el navegador del usuario, creando experiencias más ricas que mantienen información entre sesiones.
// Manipulación básica del DOM
const boton = document.querySelector('#mi-boton');
const lista = document.querySelector('#mi-lista');
boton.addEventListener('click', function() {
const nuevoElemento = document.createElement('li');
nuevoElemento.textContent = 'Nuevo elemento';
lista.appendChild(nuevoElemento);
// Guardar en localStorage
localStorage.setItem('ultimaAccion', new Date().toISOString());
});
Programación asíncrona
La naturaleza asíncrona de JavaScript es fundamental para el desarrollo web moderno. El Event Loop permite que el programa continúe ejecutándose mientras espera respuestas de operaciones lentas como peticiones de red.
Los callbacks fueron la primera solución para manejar operaciones asíncronas, pero pueden llevar al "callback hell" en código complejo. Las Promises proporcionan una alternativa más elegante, permitiendo encadenar operaciones asíncronas de manera más legible.
La sintaxis **async/await**
moderniza aún más el manejo de código asíncrono, permitiendo escribir código que se lee de manera secuencial pero se ejecuta de forma asíncrona.
// Evolución del código asíncrono
// Con Promises
fetch('/api/usuarios')
.then(response => response.json())
.then(usuarios => console.log(usuarios))
.catch(error => console.error(error));
// Con async/await
async function obtenerUsuarios() {
try {
const response = await fetch('/api/usuarios');
const usuarios = await response.json();
console.log(usuarios);
} catch (error) {
console.error(error);
}
}
Herramientas de desarrollo moderno
El ecosistema de JavaScript incluye herramientas esenciales para el desarrollo profesional. NPM (Node Package Manager) gestiona las dependencias del proyecto, permitiendo reutilizar código de la comunidad y mantener las librerías actualizadas.
Los bundlers como Vite optimizan el código para producción, combinando múltiples archivos, minimizando el tamaño y aplicando transformaciones que mejoran el rendimiento.
ESLint analiza el código en busca de errores potenciales y problemas de estilo, manteniendo la consistencia en proyectos con múltiples desarrolladores.
Los módulos ES6 permiten organizar el código en archivos separados con importaciones y exportaciones explícitas, facilitando el mantenimiento de aplicaciones grandes.
Testing y calidad del código
Las pruebas unitarias en JavaScript verifican que las funciones individuales se comportan correctamente bajo diferentes condiciones. Esto es especialmente importante en un lenguaje de tipado dinámico donde los errores pueden no ser evidentes hasta la ejecución.
Los frameworks de testing proporcionan herramientas para escribir, ejecutar y reportar pruebas de manera sistemática, integrándose en el flujo de desarrollo para detectar regresiones tempranamente.
// Ejemplo de función y su prueba
function calcularDescuento(precio, porcentaje) {
if (precio < 0 || porcentaje < 0 || porcentaje > 100) {
throw new Error('Valores inválidos');
}
return precio * (1 - porcentaje / 100);
}
// Prueba unitaria
test('calcular descuento correctamente', () => {
expect(calcularDescuento(100, 20)).toBe(80);
expect(() => calcularDescuento(-10, 20)).toThrow('Valores inválidos');
});
JavaScript continúa evolucionando con nuevas características que mejoran la expresividad del lenguaje y la productividad del desarrollador. Su versatilidad lo convierte en una herramienta fundamental tanto para principiantes que dan sus primeros pasos en la programación como para desarrolladores experimentados que construyen aplicaciones web complejas.
Tutoriales de JavaScript
Aprende JavaScript con tutoriales de programación en JavaScript.
Ejercicios de programación de JavaScript
Evalúa tus conocimientos en JavaScript con ejercicios de programación JavaScript de tipo Test, Puzzle, Código y Proyecto con VSCode.
Tipo de tecnología
Lenguaje
Categoría laboral
Full Stack
Año de lanzamiento
1995
Developers
TC39
Todos los módulos del curso de JavaScript
JavaScript
Introducción y entorno
JavaScript
Sintaxis
JavaScript
Estructuras de datos
JavaScript
Programación funcional
JavaScript
Programación Orientada a Objetos
JavaScript
DOM
JavaScript
Programación asíncrona
JavaScript
Construcción
JavaScript
Testing
Otras tecnologías
C
C
Backend
Lenguaje de propósito general, eficiente y de bajo nivel.
Rust
Rust
Backend
Lenguaje de programación de sistemas enfocado en seguridad, concurrencia y rendimiento.
R
R
Ciencia de Datos e IA
Lenguaje para análisis estadístico, manipulación de datos y visualización gráfica.
TypeScript
TypeScript
Full Stack
Superconjunto de JavaScript con tipado estático.
Go
Go
Backend
Lenguaje de programación eficiente y concurrente creado por Google.
Hibernate
Hibernate
Backend
ORM para Java, simplifica el acceso a bases de datos.