Repaso de JavaScript

Todos los conceptos básicos organizados por secciones. Léelos, prueba los ejemplos interactivos y llega al examen preparado.

// 13 secciones · ejemplos funcionales · interactivo
01

Variables y tipos

Las variables son cajitas con nombre donde guardamos información. En JS moderno usamos let (puede cambiar) y const (no puede cambiar). var existe pero es antiguo y tiene comportamientos raros, así que lo evitamos. Los tipos de datos principales son: número, texto (string), booleano, null, undefined, objeto y array.
variables_tipos.js
let   nombre   = "Ada"          // string: texto entre comillas
const edad     = 25             // number: número entero
let   activo   = true           // boolean: verdadero o falso
let   vacio    = null           // null: vacío intencionado
let   sinDef   // undefined: no se ha asignado nada

console.log(typeof nombre)      // "string"
console.log(typeof edad)        // "number"
console.log(typeof activo)      // "boolean"
console.log(typeof sinDef)      // "undefined"
typeof nos dice el tipo de cualquier valor. Útil para depurar. Fíjate que typeof null devuelve "object" — es un bug histórico de JS que no se ha podido corregir sin romper la web.
02

Operadores

Los operadores nos permiten hacer cálculos y comparaciones. Los aritméticos (+, -, *, /, %) operan con números. Los de comparación (===, !==, >, <, >=, <=) devuelven true/false. El === compara valor Y tipo (usa siempre este, no ==). Los lógicos (&&, ||, !) combinan condiciones.
operadores.js
// Aritméticos
10 + 3   // 13
10 % 3   // 1  (resto de la división)
2 ** 8   // 256 (potencia)

// Comparación (siempre ===)
"5" ==  5   // true  ← peligroso, convierte tipos
"5" === 5   // false ← correcto, compara tipo también

// Lógicos
true && false   // false (ambos deben ser true)
true || false   // true  (basta uno)
!true           // false (negación)

// Ternario: condición ? siTrue : siFalse
const msg = edad >= 18 ? "mayor" : "menor"
El operador ternario es un if/else en una sola línea: muy útil para asignar valores según una condición. El % (módulo) te da el resto de dividir, perfecto para saber si un número es par (n % 2 === 0).

▶ Prueba la calculadora

// resultado aquí
03

Condicionales

Los condicionales permiten tomar decisiones: si pasa esto, haz aquello; si no, haz lo otro. La estructura básica es if / else if / else. Para comparar un valor contra muchas opciones, switch es más limpio que encadenar muchos if.
condicionales.js
const nota = 7.5

if (nota >= 9) {
    console.log("Sobresaliente")
} else if (nota >= 7) {
    console.log("Notable")       // ← se ejecuta este
} else if (nota >= 5) {
    console.log("Aprobado")
} else {
    console.log("Suspenso")
}

// Switch: ideal para valores exactos
const dia = "lunes"
switch (dia) {
  case "lunes":
    console.log("Inicio de semana")
    break
  case "viernes":
    console.log("¡Por fin viernes!")
    break
  default:
    console.log("Un día normal")
}
JS evalúa los if de arriba a abajo y ejecuta el primero que se cumpla. En el switch, el break es imprescindible para que no caiga al siguiente case. El default equivale al else.

▶ Comprueba tu nota

// calificación aquí
04

Bucles

Los bucles repiten código mientras se cumpla una condición. for es ideal cuando sabes cuántas veces repetir. while repite mientras algo sea verdad. for...of recorre arrays elemento a elemento. for...in recorre las propiedades de un objeto.
bucles.js
// for clásico
for (let i = 0; i < 5; i++) {
    console.log(i)  // 0, 1, 2, 3, 4
}

// while
let contador = 10
while (contador > 0) {
    console.log(contador)
    contador -= 2   // 10, 8, 6, 4, 2
}

// for...of (para arrays)
const frutas = ["🍎", "🍌", "🍊"]
for (const fruta of frutas) {
    console.log(fruta)
}

// break y continue
for (let n = 0; n < 10; n++) {
    if (n === 3) continue  // salta el 3
    if (n === 7) break     // para en el 7
    console.log(n)
}
El for clásico tiene tres partes: inicio (let i=0), condición (i<5) e incremento (i++). break sale del bucle y continue salta a la siguiente iteración sin ejecutar el resto del bloque.

▶ Genera la tabla de multiplicar

// tabla aquí
05

Arrays

Un array es una lista ordenada de elementos. Se declara con corchetes [] y cada elemento tiene un índice que empieza en 0. Tienen métodos muy potentes: push añade al final, pop elimina el último, splice borra por índice, filter filtra, map transforma, find busca el primero que cumpla la condición.
arrays.js
const nums = [3, 1, 4, 1, 5, 9, 2]

nums.push(6)              // añade 6 al final
nums.pop()               // elimina el último (6)
nums.splice(2, 1)        // elimina 1 elemento desde índice 2

// map: transforma cada elemento
const dobles = nums.map(n => n * 2)

// filter: devuelve los que cumplan la condición
const mayores = nums.filter(n => n > 3)

// find: el primero que cumple
const primero = nums.find(n => n > 5)

// forEach: recorrer sin devolver nada
nums.forEach((n, i) => console.log(`[${i}] = ${n}`))

// includes / indexOf
nums.includes(9)         // true
nums.indexOf(9)          // posición

// sort y reverse
[...nums].sort((a,b) => a - b)    // orden ascendente
map y filter devuelven nuevos arrays sin modificar el original. forEach recorre pero no devuelve nada. Al hacer sort numérico, debes pasar una función comparadora (a,b) => a-b, de lo contrario ordena como texto.
06

Funciones

Una función es un bloque de código reutilizable al que le pones nombre. Le puedes pasar parámetros (datos de entrada) y puede retornar un resultado. Hay varias formas de escribirlas: declaración clásica, expresión de función y arrow function (la más moderna y compacta).
funciones.js
// Declaración clásica (se puede usar antes de definirla)
function saludar(nombre) {
    return `Hola, ${nombre}!`
}

// Expresión de función
const despedir = function(nombre) {
    return `Adiós, ${nombre}!`
}

// Arrow function
const doble = (n) => n * 2            // una línea, return implícito
const sumar = (a, b) => {             // varias líneas, return explícito
    const resultado = a + b
    return resultado
}

// Parámetros por defecto
const presentar = (nombre, rol = "alumno") => {
    return `${nombre} es ${rol}`
}

presentar("Ada")              // "Ada es alumno"
presentar("Tim", "profesor") // "Tim es profesor"
Las arrow functions son la forma preferida hoy. Si solo hay un return de una expresión, puedes omitir las llaves y el return. Los parámetros por defecto (con =) evitan tener que comprobar si el argumento llegó o no.
07

DOM

El DOM (Document Object Model) es la representación del HTML como un árbol de objetos que JS puede leer y modificar. Con él podemos seleccionar elementos, cambiar su contenido, su estilo, añadir o borrar nodos y mucho más.
dom.js
// Seleccionar elementos
const caja  = document.getElementById('miCaja')
const items = document.querySelectorAll('.item')
const btn   = document.querySelector('button')

// Leer y cambiar contenido
caja.textContent = "Hola mundo"
caja.innerHTML   = "<strong>Negrita</strong>"

// Cambiar estilos
caja.style.color      = "red"
caja.style.fontSize   = "20px"
caja.classList.add('activo')
caja.classList.remove('activo')
caja.classList.toggle('activo')   // añade o quita

// Leer valores de inputs
const valor = document.getElementById('miInput').value

// Crear y añadir elementos
const p = document.createElement('p')
p.textContent = "Nuevo párrafo"
document.body.appendChild(p)

// Eliminar elemento
p.remove()
querySelector y querySelectorAll aceptan cualquier selector CSS. textContent es más seguro que innerHTML porque no interpreta HTML (evita ataques XSS). classList.toggle es muy cómodo para activar/desactivar clases CSS.

▶ Manipula el DOM en tiempo real

Este texto cambiará...
08

Eventos

Los eventos son acciones del usuario (clic, tecla pulsada, ratón encima, scroll…) a las que podemos reaccionar con JavaScript. La forma recomendada es addEventListener, que añade una función (listener) que se ejecuta cuando ocurre el evento.
eventos.js
const btn = document.getElementById('miBoton')

// addEventListener(tipo, función)
btn.addEventListener('click', () => {
    console.log('¡Hiciste clic!')
})

// El objeto 'event' tiene info del evento
btn.addEventListener('click', (event) => {
    console.log(event.target)    // el elemento clicado
    console.log(event.type)      // "click"
})

// Eventos de teclado
document.addEventListener('keydown', (e) => {
    console.log(e.key)           // "Enter", "a", "Escape"...
})

// Eventos de formulario
const input = document.getElementById('miInput')
input.addEventListener('input', (e) => {
    console.log(e.target.value)  // valor en tiempo real
})

// Prevenir comportamiento por defecto
form.addEventListener('submit', (e) => {
    e.preventDefault()          // evita que recargue la página
})
e.preventDefault() es esencial en formularios para evitar que la página se recargue. event.target apunta al elemento exacto que disparó el evento. Puedes añadir varios listeners al mismo elemento.

▶ Detector de eventos

// eventos aquí
09

Math

El objeto Math de JS tiene constantes y métodos matemáticos ya listos para usar. No necesitas hacer new Math(), se usa directamente. Los más útiles: Math.random() genera un número entre 0 y 1, Math.floor/ceil/round redondean, y Math.max/min devuelven el mayor o menor.
math.js
// Constantes
Math.PI         // 3.14159...
Math.E          // 2.71828...

// Redondeo
Math.floor(4.9)   // 4  (hacia abajo)
Math.ceil(4.1)    // 5  (hacia arriba)
Math.round(4.5)  // 5  (el más cercano)

// Valor absoluto, raíz, potencia
Math.abs(-7)      // 7
Math.sqrt(25)     // 5
Math.pow(2, 10)   // 1024

// Max y min
Math.max(3, 9, 1)  // 9
Math.min(3, 9, 1)  // 1

// Número aleatorio entre min y max (entero)
function aleatorio(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min
}
aleatorio(1, 6)   // simula un dado
Math.random() devuelve un decimal entre 0 (incluido) y 1 (excluido). La fórmula Math.floor(Math.random() * (max - min + 1)) + min es el patrón estándar para enteros aleatorios en un rango.

▶ Lanza el dado

10

Strings

Los strings (cadenas de texto) tienen métodos para buscar, cortar, transformar y combinar texto. Los template literals (comillas invertidas `` ` ``) permiten insertar variables directamente con ${variable}.
strings.js
const texto = "  Hola Mundo  "

texto.length              // 14 (longitud)
texto.trim()              // "Hola Mundo" (quita espacios)
texto.toUpperCase()      // "  HOLA MUNDO  "
texto.toLowerCase()      // "  hola mundo  "
texto.includes("Mundo")  // true
texto.startsWith("Ho")  // false (tiene espacios)
texto.trim().startsWith("Ho")  // true

// Extraer
texto.slice(2, 6)         // "Hola"
texto.split(" ")          // array de palabras

// Reemplazar
texto.replace("Mundo", "JS")   // "  Hola JS  "
texto.replaceAll("o", "0")    // reemplaza todas

// Template literal
const nombre = "Ana"
const saludo = `Hola, ${nombre}! Tienes ${2024 - 2000} años`

// Rellenar con ceros
String(5).padStart(2, "0")   // "05"
Los métodos de string no modifican el original, devuelven uno nuevo. Es muy común encadenarlos: texto.trim().toLowerCase(). split convierte un string en array y join hace lo contrario.
11

Fechas

El objeto Date de JS maneja fechas y horas. new Date() crea la fecha y hora actual. Puedes extraer partes como el día, mes o año con métodos get.... Ojo: los meses van de 0 (enero) a 11 (diciembre).
fechas.js
const ahora = new Date()

ahora.getFullYear()   // 2025
ahora.getMonth()      // 0-11  ← ojo, enero=0
ahora.getDate()       // día del mes (1-31)
ahora.getDay()        // día semana (0=domingo)
ahora.getHours()      // hora (0-23)
ahora.getMinutes()    // minutos
ahora.getTime()       // milisegundos desde 1 ene 1970

// Crear una fecha concreta
const navidad = new Date(2025, 11, 25)  // mes 11 = diciembre

// Calcular diferencia en días
const hoy  = new Date()
const fin  = new Date(2025, 5, 20)  // 20 junio
const diff = fin - hoy               // diferencia en ms
const dias = Math.ceil(diff / (1000 * 60 * 60 * 24))

// Formatear con toLocaleDateString
ahora.toLocaleDateString('es-ES')  // "12/05/2025"
Para calcular diferencias de fechas, JS trabaja en milisegundos. La fórmula diff / (1000 * 60 * 60 * 24) convierte milisegundos a días. toLocaleDateString formatea la fecha según el idioma/región.

▶ Calculadora de días

// días aquí
12

Formularios

Los formularios HTML permiten recoger datos del usuario. Con JS los hacemos dinámicos: leemos los valores con .value, validamos que no estén vacíos con .trim() y los procesamos sin recargar la página. A continuación hay un gestor de préstamos CRUD completo (Crear, Leer, Actualizar, Borrar).
formularios.js — lectura de campos
// Leer diferentes tipos de input
const nombre  = document.getElementById('nombre').value.trim()
const opcion  = document.getElementById('select').value
const marcado = document.getElementById('check').checked
const radio   = document.querySelector('input[name="turno"]:checked')

// Validación básica
if (nombre === "") {
    alert("El nombre es obligatorio")
    return
}
if (!radio) {
    alert("Selecciona un turno")
    return
}
.trim() elimina los espacios al inicio y final — así evitas que alguien envíe solo espacios. .checked devuelve true/false para checkboxes y radios. El selector input[name="turno"]:checked busca el radio seleccionado de ese grupo.

▶ Gestor de préstamos (CRUD completo)

Alumno Material Turno Devuelto Acciones
No hay préstamos registrados
13

Errores típicos

En JS hay errores que todo el mundo comete al empezar. Conocerlos de antemano te ahorra mucho tiempo. Aquí están los más frecuentes con su solución. También existe try/catch para capturar errores en tiempo de ejecución sin que el programa explote.
errores_tipicos.js
// ❌ ERROR 1: = en vez de === en if
if (x = 5) { }    // asigna, no compara
if (x === 5) { }  // ✅ correcto

// ❌ ERROR 2: var en vez de let/const
// var tiene scope de función, no de bloque → comportamientos raros

// ❌ ERROR 3: olvidar break en switch
switch(n) {
  case 1: console.log("uno")  // sin break cae al case 2
  case 2: console.log("dos")
}

// ❌ ERROR 4: meses de Date empiezan en 0
new Date(2025, 12, 25) // ❌ mes 12 no existe → enero 2026
new Date(2025, 11, 25) // ✅ mes 11 = diciembre

// ❌ ERROR 5: comparar con == en vez de ===
"0" == false  // true  ← trampa
"0" === false // false ← correcto

// ✅ try/catch para capturar errores
try {
    const data = JSON.parse(textoInvalido)  // puede fallar
} catch (error) {
    console.log("Error:", error.message)     // lo capturamos
} finally {
    console.log("Esto siempre se ejecuta")
}

// ❌ ERROR 6: .innerHTML en bucle (lento)
lista.innerHTML += "..."      // ❌ repinta el DOM cada iteración
// ✅ Construye primero, luego asigna una vez
let html = ""
items.forEach(i => html += `<li>${i}</li>`)
lista.innerHTML = html            // ✅ una sola vez
El try/catch envuelve código que podría lanzar un error y lo atrapa sin romper la ejecución. El bloque finally se ejecuta siempre, haya error o no (útil para cerrar recursos). El error 6 es muy habitual en la práctica de préstamos.