1. No hace falta reinventar la rueda
Buena parte de programar bien consiste en saber qué te da ya hecho el lenguaje. JavaScript trae de serie una colección de objetos predefinidos con cientos de métodos para trabajar con textos, números, fechas y listas, y el navegador añade otros para controlar la ventana, la dirección de la página o el almacenamiento. Si antes de escribir un bucle te preguntas «¿esto no existirá ya?», casi siempre la respuesta es sí.
Dos cajas de herramientas
2. Textos
Los textos son inmutables: ningún método cambia el texto original, todos devuelven uno nuevo. Es el error más común al empezar: escribir nombre.toUpperCase(); y esperar que nombre haya cambiado. Hay que guardar el resultado: nombre = nombre.toUpperCase();.
| Método | Para qué | Ejemplo |
|---|---|---|
| length | Número de caracteres (es una propiedad, sin paréntesis) | "hola".length → 4 |
| toUpperCase / toLowerCase | Cambiar mayúsculas | "Ana".toUpperCase() → "ANA" |
| trim | Quitar espacios de los extremos | " sí ".trim() → "sí" |
| includes / startsWith / endsWith | ¿Contiene, empieza o termina por…? | "index.html".endsWith(".html") → true |
| indexOf | Posición de un texto (-1 si no está) | "hola".indexOf("la") → 2 |
| slice | Extraer un trozo (admite posiciones negativas) | "JavaScript".slice(0, 4) → "Java" |
| split / join | Texto → array y viceversa | "a,b,c".split(",") → ["a","b","c"] |
| replace / replaceAll | Sustituir (acepta expresiones regulares) | "1-2-3".replaceAll("-", "/") |
| padStart | Rellenar hasta una longitud | String(7).padStart(2, "0") → "07" |
3. Números y el objeto Math
Para convertir un texto en número tienes tres opciones que no se comportan igual. Number("12px") es NaN porque exige que todo el texto sea un número; parseInt("12px") es 12 porque lee hasta donde puede; y parseFloat("3.5 kg") es 3.5. Para datos de formularios, Number es la opción más segura: si el usuario escribe algo raro te enteras.
Math es un objeto con funciones matemáticas: Math.round, Math.floor y Math.ceil redondean, Math.max y Math.min buscan extremos, Math.abs, Math.sqrt… Y Math.random() devuelve un decimal entre 0 (incluido) y 1 (excluido), con el que se construye cualquier número aleatorio:
1// Entero aleatorio entre min y max, ambos incluidos
2function aleatorio(min, max) {
3 return Math.floor(Math.random() * (max - min + 1)) + min;
4}
5
6const dado = aleatorio(1, 6);
7const precio = 19.999;
8console.log(precio.toFixed(2)); // "20.00" (texto, para mostrar)4. Fechas y formatos regionales
El objeto Date guarda un instante como el número de milisegundos desde el 1 de enero de 1970. Tiene una trampa histórica que todo el mundo sufre una vez: los meses empiezan en 0. new Date(2025, 0, 15) es el 15 de enero, y getMonth() devuelve 0 para enero y 11 para diciembre. Los días del mes, en cambio, empiezan en 1.
1const ahora = new Date();
2const examen = new Date("2025-06-20"); // formato ISO: año-mes-día
3const faltan = examen - ahora; // restar fechas da milisegundos
4
5console.log(examen.getFullYear(), examen.getMonth() + 1, examen.getDate());
6console.log(examen.toLocaleDateString("es-ES", { weekday: "long", day: "numeric", month: "long" }));
7// "viernes, 20 de junio"Para mostrar números, monedas y fechas al estilo de cada país no construyas el texto a mano: usa Intl, la API de internacionalización. Sabe que en España el decimal es una coma, que el euro va detrás y cómo se escriben los meses en cada idioma.
1const euros = new Intl.NumberFormat("es-ES", { style: "currency", currency: "EUR" });
2euros.format(1234.5); // "1234,50 €"
3
4const porcentaje = new Intl.NumberFormat("es-ES", { style: "percent" });
5porcentaje.format(0.21); // "21 %"
6
7new Intl.RelativeTimeFormat("es", { numeric: "auto" }).format(-1, "day"); // "ayer"5. Arrays: los métodos que usarás a diario
Un array es una lista ordenada de valores de cualquier tipo. Además de añadir y quitar elementos, tiene una familia de métodos que reciben una función y la aplican a cada elemento. Dominar map, filter y reduce cambia tu forma de programar: en lugar de explicar al ordenador cómo recorrer la lista con un bucle, le dices qué quieres obtener.
| Método | Qué devuelve | ¿Modifica el array? |
|---|---|---|
| push / pop | Añade o quita al final | Sí |
| unshift / shift | Añade o quita al principio | Sí |
| splice(pos, n) | Borra (e inserta) en cualquier posición | Sí |
| slice(a, b) | Una copia de un trozo | No |
| includes / indexOf | Si está / en qué posición | No |
| find / findIndex | El primer elemento que cumple la condición / su posición | No |
| filter | Un array con los que cumplen la condición | No |
| map | Un array con cada elemento transformado | No |
| reduce | Un único valor acumulado (suma, objeto…) | No |
| some / every | Si alguno / todos cumplen la condición | No |
| sort | El array ordenado | Sí (usa toSorted para una copia) |
1const productos = [
2 { nombre: "Teclado", precio: 25, stock: 4 },
3 { nombre: "Monitor", precio: 180, stock: 0 },
4 { nombre: "Ratón", precio: 12, stock: 10 },
5];
6
7const disponibles = productos.filter((p) => p.stock > 0);
8const nombres = disponibles.map((p) => p.nombre); // ["Teclado", "Ratón"]
9const valorStock = productos.reduce((total, p) => total + p.precio * p.stock, 0); // 220
10const porPrecio = productos.toSorted((a, b) => a.precio - b.precio); // del más barato al más carosort ordena como texto
sort convierte los elementos a texto: [10, 9, 1].sort() da [1, 10, 9]. Para números usa siempre sort((a, b) => a - b).JSON
JSON es el formato con el que viajan los datos entre el navegador y el servidor. Se parece mucho a los objetos de JavaScript, con dos diferencias: las claves van siempre entre comillas dobles y no admite funciones ni undefined. JSON.stringify(objeto) convierte un objeto en texto y JSON.parse(texto) hace lo contrario (y lanza un error si el texto no es JSON válido).
6. Los objetos del navegador (BOM)
El BOM (Browser Object Model) es el conjunto de objetos que el navegador pone a tu disposición. Todos cuelgan de window, que representa la pestaña y es el objeto global: por eso puedes escribir alert() en lugar de window.alert().
| Objeto | Para qué sirve | Ejemplo |
|---|---|---|
| location | La dirección actual; cambiarla navega | location.href, location.search, location.reload() |
| history | El historial de la pestaña | history.back(), history.pushState(…) |
| navigator | Información del navegador y acceso a APIs | navigator.language, navigator.clipboard, navigator.geolocation |
| screen | La pantalla del dispositivo | screen.width, screen.height |
| localStorage | Guardar texto que sobrevive al cerrar el navegador | localStorage.setItem("tema", "oscuro") |
| sessionStorage | Igual, pero se borra al cerrar la pestaña | sessionStorage.getItem("paso") |
| alert / confirm / prompt | Diálogos del sistema (bloquean la página) | if (confirm("¿Borrar?")) … |
Temporizadores
setTimeout(funcion, ms) ejecuta una función una vez pasado un tiempo, y setInterval(funcion, ms) la ejecuta repetidamente. Los dos devuelven un identificador que sirve para cancelarlos con clearTimeout o clearInterval. El tiempo es un mínimo, no una garantía: si el navegador está ocupado o la pestaña está en segundo plano, puede tardar más.
localStorage solo guarda texto, así que para guardar objetos se combinan con JSON: localStorage.setItem("carrito", JSON.stringify(carrito)) y JSON.parse(localStorage.getItem("carrito") ?? "[]"). Nunca guardes ahí contraseñas ni datos sensibles: cualquier script de la página puede leerlo.
(sin mensajes)7. Retos
Cada reto se resuelve con pocas líneas si eliges bien los métodos. Si te encuentras escribiendo un bucle largo, vuelve a mirar las tablas del tema.
Las URL de un blog se forman a partir del título. Completa crearSlug(titulo) para que devuelva el título en minúsculas, sin tildes ni signos, con las palabras separadas por un único guion y sin guiones al principio ni al final. crearSlug("¡Hola Mundo, DAW 2025!") devuelve "hola-mundo-daw-2025" y crearSlug(" Programación en JavaScript ") devuelve "programacion-en-javascript".
Completa estadisticas(notas) para que devuelva un objeto con la media redondeada a 2 decimales (como número), la nota máxima, la mínima y cuántos aprobados hay (nota ≥ 5): { media, maxima, minima, aprobados }. Si el array está vacío, devuelve null.
Completa diasEntre(desde, hasta), que recibe dos fechas en formato "AAAA-MM-DD" y devuelve cuántos días hay de una a otra (negativo si hasta es anterior). diasEntre("2025-06-01", "2025-06-24") devuelve 23.
Al pulsar #guardar debe aparecer el texto «Guardado» en #aviso y borrarse solo 1 segundo después. Si se vuelve a pulsar antes de que desaparezca, el temporizador empieza de nuevo (el aviso no debe borrarse antes de tiempo).