Fundamentos de JavaScript
JavaScript es el lenguaje de programación del navegador. Permite hacer páginas web dinámicas e interactivas. Con JS moderno (ES6+) podés construir desde efectos simples hasta apps completas.
JavaScript — Variables y Tipos
// ── VARIABLES ────────────────────────────────────
const nombre = "Ana"; // constante — no cambia
let edad = 17; // variable — puede cambiar
// var (evitar en código moderno)
// ── TIPOS DE DATOS ────────────────────────────────
const num = 42; // number
const texto = "Hola"; // string
const activo = true; // boolean
const nada = null; // null
const sinDef = undefined; // undefined
// ── TEMPLATE LITERALS ────────────────────────────
const saludo = `Hola, ${nombre}! Tenés ${edad} años.`;
// ── OPERADORES MODERNOS ──────────────────────────
const x = null;
const valor = x ?? "valor por defecto"; // Nullish coalescing
let usuario = null;
const clave = usuario?.nombre ?? "Anónimo"; // Optional chaining
// ── CONDICIONALES ────────────────────────────────
if (edad >= 18) {
console.log("Mayor de edad");
} else if (edad >= 13) {
console.log("Adolescente");
} else {
console.log("Niño");
}
// Ternario
const estado = edad >= 18 ? "mayor" : "menor";
Funciones Modernas (ES6+)
JavaScript
// Función tradicional
function sumar(a, b) {
return a + b;
}
// Arrow function (la forma moderna)
const sumar = (a, b) => a + b;
// Con cuerpo (bloque)
const calcular = (a, b, op) => {
if (op === "+") return a + b;
if (op === "-") return a - b;
return null;
};
// Parámetros por defecto
const saludar = (nombre = "Mundo") => `¡Hola, ${nombre}!`;
saludar(); // ¡Hola, Mundo!
saludar("Ana"); // ¡Hola, Ana!
// Rest params: recibir cantidad variable de argumentos
const promedio = (...nums) => {
const suma = nums.reduce((a, b) => a + b, 0);
return suma / nums.length;
};
promedio(8, 7, 9, 10); // 8.5
// Destructuring
const [x, y, ...resto] = [1, 2, 3, 4, 5];
const { nombre, edad, ciudad = "BA" } = { nombre: "Ana", edad: 17 };
Arrays y Objetos
JavaScript — Métodos de Array
const notas = [8, 5, 9, 7, 6, 10, 4];
// map() — transforma cada elemento
const dobles = notas.map(n => n * 2);
// [16, 10, 18, 14, 12, 20, 8]
// filter() — filtra según condición
const aprobadas = notas.filter(n => n >= 6);
// [8, 9, 7, 6, 10]
// find() — primer elemento que cumple
const primera10 = notas.find(n => n === 10);
// 10
// reduce() — acumula en un solo valor
const suma = notas.reduce((acc, n) => acc + n, 0);
const prom = suma / notas.length;
// some() — ¿alguno cumple?
const hayDesaprobados = notas.some(n => n < 6); // true
// every() — ¿todos cumplen?
const todosAprobados = notas.every(n => n >= 6); // false
// sort() — ordenar (CUIDADO: modifica el original)
const ordenadas = [...notas].sort((a, b) => a - b);
// Objetos y spread operator
const alumno = { nombre: "Ana", edad: 17 };
const actualizado = { ...alumno, edad: 18, ciudad: "BA" };
// Array de objetos
const alumnos = [
{ nombre: "Ana", nota: 9 },
{ nombre: "Luis", nota: 7 },
{ nombre: "Pedro", nota: 5 }
];
const aprobados = alumnos
.filter(a => a.nota >= 6)
.map(a => a.nombre);
// ["Ana", "Luis"]
Manipulación del DOM
El DOM (Document Object Model) es la representación en árbol del HTML. JavaScript puede leerlo y modificarlo en tiempo real.
JavaScript — DOM
// ── SELECCIONAR ELEMENTOS ────────────────────────
const titulo = document.getElementById("titulo");
const boton = document.querySelector(".btn-enviar");
const cards = document.querySelectorAll(".card");
// ── LEER Y MODIFICAR CONTENIDO ───────────────────
titulo.textContent = "Nuevo título"; // solo texto
titulo.innerHTML = "Título con <strong>negrita</strong>"; // HTML
// ── MODIFICAR ESTILOS ─────────────────────────────
titulo.style.color = "#00b4ff";
titulo.style.fontSize = "2rem";
// ── CLASES ────────────────────────────────────────
boton.classList.add("activo");
boton.classList.remove("deshabilitado");
boton.classList.toggle("visible"); // agrega/quita
boton.classList.contains("activo"); // true/false
// ── ATRIBUTOS ─────────────────────────────────────
const link = document.querySelector("a");
link.setAttribute("href", "https://nueva-url.com");
link.getAttribute("href");
// ── CREAR Y AGREGAR ELEMENTOS ─────────────────────
const nuevoItem = document.createElement("li");
nuevoItem.textContent = "Nuevo ítem";
nuevoItem.classList.add("item-lista");
const lista = document.querySelector("ul");
lista.appendChild(nuevoItem); // al final
lista.prepend(nuevoItem); // al principio
nuevoItem.remove(); // eliminar
Manejo de Eventos
JavaScript — Eventos
const boton = document.getElementById("mi-btn");
// Agregar escuchador de eventos
boton.addEventListener("click", (event) => {
console.log("¡Click!");
event.preventDefault(); // evitar comportamiento default
});
// Otros eventos comunes
document.addEventListener("DOMContentLoaded", () => {
// El DOM está listo
});
const input = document.querySelector("input");
input.addEventListener("input", (e) => {
console.log(`Valor: ${e.target.value}`);
});
input.addEventListener("keydown", (e) => {
if (e.key === "Enter") buscar();
});
window.addEventListener("scroll", () => {
const pct = (window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100;
progressBar.style.width = `${pct}%`;
});
// Event Delegation: escuchar eventos en el padre
documento.querySelector(".lista").addEventListener("click", (e) => {
if (e.target.matches(".item")) {
e.target.classList.toggle("completado");
}
});
Asincronía: Fetch y Async/Await
JavaScript es asíncrono por naturaleza. fetch() permite hacer peticiones HTTP, y async/await hace que el código asíncrono se lea como si fuera sincrónico.
JavaScript — Fetch API
// ── FETCH con async/await ────────────────────────
async function obtenerUsuarios() {
try {
// 1. Hacemos la petición
const respuesta = await fetch("https://jsonplaceholder.typicode.com/users");
// 2. Verificamos que fue exitosa
if (!respuesta.ok) {
throw new Error(`Error HTTP: ${respuesta.status}`);
}
// 3. Convertimos la respuesta a JSON
const usuarios = await respuesta.json();
// 4. Mostramos los datos
renderizarUsuarios(usuarios);
} catch (error) {
console.error("Error al traer usuarios:", error);
mostrarError("No se pudo cargar la información");
}
}
// Función para renderizar
function renderizarUsuarios(usuarios) {
const lista = document.getElementById("lista-usuarios");
lista.innerHTML = usuarios.map(u => `
<li class="usuario">
<strong>${u.name}</strong> — ${u.email}
</li>
`).join("");
}
// Llamamos la función
obtenerUsuarios();
// ── POST con fetch ────────────────────────────────
async function crearPost(datos) {
const res = await fetch("https://jsonplaceholder.typicode.com/posts", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(datos)
});
const nuevo = await res.json();
console.log("Creado:", nuevo);
}
Ejercicios Resueltos
EJERCICIO 1
Lista de tareas dinámica (To-Do)
Implementá una lista de tareas donde podés agregar, marcar como completadas y eliminar tareas.
- 1Escuchamos el submit del formulario para agregar tareas.
- 2Creamos el elemento HTML dinámicamente con createElement.
- 3Usamos Event Delegation en la lista para manejar clicks.
- 4Guardamos en localStorage para persistencia.
JavaScript — Solución
// Estado
let tareas = JSON.parse(localStorage.getItem("tareas")) || [];
// Guardar en localStorage
function guardar() {
localStorage.setItem("tareas", JSON.stringify(tareas));
}
// Renderizar la lista
function render() {
const lista = document.getElementById("lista-tareas");
lista.innerHTML = tareas.map((t, i) => `
<li class="tarea ${t.completada ? 'completada' : ''}" data-id="${i}">
<span class="tarea-texto">${t.texto}</span>
<div class="tarea-btns">
<button class="btn-toggle" data-id="${i}">
${t.completada ? '↩' : '✓'}
</button>
<button class="btn-delete" data-id="${i}">🗑</button>
</div>
</li>
`).join("");
}
// Agregar tarea
document.getElementById("form-tarea").addEventListener("submit", (e) => {
e.preventDefault();
const input = document.getElementById("input-tarea");
const texto = input.value.trim();
if (!texto) return;
tareas.push({ texto, completada: false });
guardar();
render();
input.value = "";
});
// Event Delegation para toggle y delete
document.getElementById("lista-tareas").addEventListener("click", (e) => {
const id = +e.target.dataset.id;
if (e.target.matches(".btn-toggle")) {
tareas[id].completada = !tareas[id].completada;
} else if (e.target.matches(".btn-delete")) {
tareas.splice(id, 1);
}
guardar();
render();
});
render(); // renderizar al cargar
Ejercicios Propuestos
PROPUESTO 1
App de clima con Fetch
Creá una app que busque el clima de una ciudad utilizando la API de Open-Meteo (gratuita).
- Input para ingresar la ciudad + botón buscar.
- Mostrar: temperatura, viento, descripción del cielo.
- Manejar errores: ciudad no encontrada.
- Mostrar un loader mientras carga.
PROPUESTO 2
Carrito de compras
Implementá un carrito de compras con JavaScript puro.
- Grid de productos (nombre, precio, botón "Agregar").
- Carrito lateral con los productos seleccionados.
- Cambiar cantidad, eliminar item, total dinámico.
- Persistir en localStorage.