Apuntes DAM
    Tema 3 de 7DWEC · 2º DAW

    Desarrollo Web en Entorno Cliente

    Objetos Predefinidos y BOM

    Textos, números y Math, fechas e Intl, métodos de array (map, filter, reduce, sort), JSON, objetos del navegador (location, history, navigator, localStorage) y temporizadores.

    60 min lecturaIntermedio

    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

    Las del lenguaje
    String, Number, Math, Date, Array, JSON, Map… Funcionan igual en el navegador y en Node.js.
    Las del navegador (BOM)
    window, location, history, navigator, localStorage, temporizadores… Solo existen en el navegador.
    El manual
    MDN Web Docs describe cada método con ejemplos. Tenlo siempre abierto en otra pestaña.

    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étodoPara quéEjemplo
    lengthNúmero de caracteres (es una propiedad, sin paréntesis)"hola".length → 4
    toUpperCase / toLowerCaseCambiar mayúsculas"Ana".toUpperCase() → "ANA"
    trimQuitar espacios de los extremos" sí ".trim() → "sí"
    includes / startsWith / endsWith¿Contiene, empieza o termina por…?"index.html".endsWith(".html") → true
    indexOfPosición de un texto (-1 si no está)"hola".indexOf("la") → 2
    sliceExtraer un trozo (admite posiciones negativas)"JavaScript".slice(0, 4) → "Java"
    split / joinTexto → array y viceversa"a,b,c".split(",") → ["a","b","c"]
    replace / replaceAllSustituir (acepta expresiones regulares)"1-2-3".replaceAll("-", "/")
    padStartRellenar hasta una longitudString(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:

    javascript
    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.

    javascript
    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.

    javascript
    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étodoQué devuelve¿Modifica el array?
    push / popAñade o quita al finalSí
    unshift / shiftAñade o quita al principioSí
    splice(pos, n)Borra (e inserta) en cualquier posiciónSí
    slice(a, b)Una copia de un trozoNo
    includes / indexOfSi está / en qué posiciónNo
    find / findIndexEl primer elemento que cumple la condición / su posiciónNo
    filterUn array con los que cumplen la condiciónNo
    mapUn array con cada elemento transformadoNo
    reduceUn único valor acumulado (suma, objeto…)No
    some / everySi alguno / todos cumplen la condiciónNo
    sortEl array ordenadoSí (usa toSorted para una copia)
    javascript
    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 caro

    sort ordena como texto

    Sin función de comparación, 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().

    ObjetoPara qué sirveEjemplo
    locationLa dirección actual; cambiarla navegalocation.href, location.search, location.reload()
    historyEl historial de la pestañahistory.back(), history.pushState(…)
    navigatorInformación del navegador y acceso a APIsnavigator.language, navigator.clipboard, navigator.geolocation
    screenLa pantalla del dispositivoscreen.width, screen.height
    localStorageGuardar texto que sobrevive al cerrar el navegadorlocalStorage.setItem("tema", "oscuro")
    sessionStorageIgual, pero se borra al cerrar la pestañasessionStorage.getItem("paso")
    alert / confirm / promptDiá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.

    Reloj con setInterval
    Consola
    (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.

    🧩JS · DOMDirecciones amigables (slugs)Medio

    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".

    index.htmlsolo lectura
    script.js
    Vista previa
    🧩JS · DOMEstadísticas de un grupoMedio

    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.

    index.htmlsolo lectura
    script.js
    Vista previa
    🧩JS · DOM¿Cuántos días faltan?Medio

    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.

    index.htmlsolo lectura
    script.js
    Vista previa
    🧩JS · DOMAviso que desapareceDifícil

    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).

    index.htmlsolo lectura
    script.js
    Vista previa

    ¿Has terminado este tema?

    Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

    Guardar mi progreso