Guía completa de JavaScript desde cero (2026)
La guía pilar para aprender JavaScript de verdad: variables, funciones, arrays, DOM, async/await, errores comunes, mini proyecto To-Do y plan de 4 semanas.
camilogaon
@camilogaon
Guía completa de JavaScript desde cero (2026)
Si quieres aprender a programar de verdad y no solo copiar tutoriales, JavaScript es el mejor punto de partida. Corre en el navegador, en el servidor (Node.js) y en un montón de herramientas modernas. Esta guía está pensada para llevarte desde cero hasta un nivel sólido, con ejemplos, errores comunes y un plan de práctica.
Tiempo estimado de lectura: 35–45 minutos.
Nivel: principiante → intermedio.
Objetivo: entender JS bien y poder construir proyectos reales.
//1. Qué es JavaScript (y qué no es)
JavaScript (JS) es un lenguaje de programación interpretado, dinámico y multiparadigma. Hoy lo usas para:
- Interactividad en páginas web (DOM, eventos, formularios)
- Aplicaciones frontend (React, Next.js, Vue, Svelte)
- Backend con Node.js / NestJS / Express
- Scripts, automatización y herramientas CLI
No confundas:
| Concepto | Qué es |
|---|---|
| JavaScript | El lenguaje |
| Java | Otro lenguaje distinto (no es “JS avanzado”) |
| ECMAScript (ES) | El estándar oficial de JS (ES6, ES2020…) |
| TypeScript | JS + tipos estáticos (superset) |
Cómo ejecutar JavaScript hoy
- Consola del navegador (F12 → Console): ideal para pruebas rápidas.
- Archivo
.html+.js: para aprender DOM. - Node.js: para correr JS fuera del navegador.
- Un playground (CodeSandbox, StackBlitz): para practicar sin instalar nada.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Hola JS</title>
</head>
<body>
<h1 id="titulo">Hola</h1>
<script src="app.js"></script>
</body>
</html>
// app.js
console.log("Hola desde JavaScript");
document.getElementById("titulo").textContent = "Hola, Programemos";
//2. Variables: let, const y por qué evitar var
const nombre = "Ana"; // no se reasigna
let edad = 20; // sí se puede reasignar
edad = 21;
// var es legacy: scope raro, hoisting confuso → evítalo en código nuevo
Regla práctica: usa const por defecto. Cambia a let solo si necesitas reasignar.
Tipos primitivos
typeof 42; // "number"
typeof "hola"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" ← bug histórico de JS
typeof 10n; // "bigint"
typeof Symbol("x"); // "symbol"
Truthy y falsy (imprescindible)
Valores falsy: false, 0, "", null, undefined, NaN.
Todo lo demás es truthy (incluido [] y {}).
if (nombre) {
console.log("Hay nombre");
}
//3. Operadores y comparaciones (cuidado con ==)
3 + 2; // 5
"3" + 2; // "32" ← concatena
"3" - 2; // 1 ← convierte a número
10 > 5; // true
10 === "10"; // false ← estricto (recomendado)
10 == "10"; // true ← coerción (evítalo)
Siempre usa === y !==.
Operadores lógicos útiles:
const user = null;
const nombreVisible = user?.name ?? "Invitado";
const puerto = process.env.PORT || 3001; // ojo: 0 sería falsy
const puertoSeguro = process.env.PORT ?? 3001;
//4. Strings: plantillas y métodos clave
const lenguaje = "JavaScript";
const msg = `Estoy aprendiendo ${lenguaje}`;
"hola mundo".includes("mundo"); // true
"hola".toUpperCase(); // "HOLA"
" trim ".trim(); // "trim"
"a,b,c".split(","); // ["a","b","c"]
["a","b"].join("-"); // "a-b"
//5. Condicionales y control de flujo
const nota = 85;
if (nota >= 90) {
console.log("Excelente");
} else if (nota >= 70) {
console.log("Aprobado");
} else {
console.log("A practicar más");
}
const rol = "ADMIN";
switch (rol) {
case "ADMIN":
console.log("Acceso total");
break;
case "USER":
console.log("Acceso limitado");
break;
default:
console.log("Sin rol");
}
Ternario (para expresiones cortas):
const etiqueta = nota >= 70 ? "ok" : "repite";
//6. Bucles: for, while, for...of
const techs = ["js", "ts", "python"];
for (let i = 0; i < techs.length; i++) {
console.log(i, techs[i]);
}
for (const tech of techs) {
console.log(tech);
}
let n = 3;
while (n > 0) {
console.log(n);
n--;
}
Para objetos:
const user = { name: "Luis", level: 3 };
for (const key of Object.keys(user)) {
console.log(key, user[key]);
}
//7. Funciones (el corazón de JS)
function sumar(a, b) {
return a + b;
}
const multiplicar = function (a, b) {
return a * b;
};
const dividir = (a, b) => a / b;
Parámetros por defecto y rest
function saludar(nombre = "mundo") {
return `Hola, ${nombre}`;
}
function promedio(...nums) {
const total = nums.reduce((acc, n) => acc + n, 0);
return total / nums.length;
}
promedio(10, 8, 9); // 9
Scope y closures
function crearContador() {
let count = 0;
return function () {
count += 1;
return count;
};
}
const next = crearContador();
next(); // 1
next(); // 2
Un closure es una función que “recuerda” variables de su entorno externo. Aparece todo el tiempo en callbacks, hooks y handlers.
//8. Arrays: métodos que sí debes dominar
const nums = [1, 2, 3, 4, 5];
nums.map((n) => n * 2); // [2,4,6,8,10]
nums.filter((n) => n % 2 === 0); // [2,4]
nums.find((n) => n > 3); // 4
nums.some((n) => n > 4); // true
nums.every((n) => n > 0); // true
nums.reduce((acc, n) => acc + n, 0); // 15
const copia = [...nums, 6];
const [primero, segundo, ...resto] = nums;
Ejercicio: dado un array de usuarios, obtén solo los nombres de quienes tienen active: true.
const users = [
{ name: "Ana", active: true },
{ name: "Bob", active: false },
{ name: "Cami", active: true },
];
const activos = users.filter((u) => u.active).map((u) => u.name);
// ["Ana", "Cami"]
//9. Objetos: literales, destructuring y referencias
const curso = {
title: "JavaScript desde cero",
lessons: 29,
published: true,
};
const { title, lessons } = curso;
const curso2 = { ...curso, lessons: 30 };
curso.category = "Lenguajes";
delete curso.published;
Importante: los objetos y arrays se pasan por referencia.
const a = { x: 1 };
const b = a;
b.x = 2;
console.log(a.x); // 2 ← mismo objeto en memoria
Para clonar de forma superficial: { ...obj } o structuredClone(obj) (clon profundo moderno).
//10. DOM y eventos (JS en el navegador)
const btn = document.querySelector("#guardar");
const input = document.querySelector("#email");
const lista = document.querySelector("#lista");
btn.addEventListener("click", () => {
const email = input.value.trim();
if (!email.includes("@")) {
alert("Email inválido");
return;
}
const li = document.createElement("li");
li.textContent = email;
lista.appendChild(li);
input.value = "";
});
Conceptos clave:
querySelector/querySelectorAlltextContentvsinnerHTML(cuidado con XSS)classList.add/remove/toggle- delegación de eventos en listas dinámicas
//11. Asincronía: callbacks → promesas → async/await
JS no espera operaciones lentas (red, timers). Por eso existe el modelo asíncrono.
Promesas
function esperar(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
esperar(1000).then(() => console.log("Pasó 1s"));
fetch + async/await
async function cargarPosts() {
try {
const res = await fetch("https://jsonplaceholder.typicode.com/posts?_limit=3");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data;
} catch (err) {
console.error("Falló la carga", err);
return [];
}
}
Paralelismo con Promise.all
const [users, posts] = await Promise.all([
fetch("/api/users").then((r) => r.json()),
fetch("/api/posts").then((r) => r.json()),
]);
//12. Módulos ES (import / export)
// math.js
export function sum(a, b) {
return a + b;
}
export const PI = 3.14159;
// app.js
import { sum, PI } from "./math.js";
console.log(sum(2, PI));
En Node moderno también puedes usar ESM. En proyectos reales (Next, Nest, Vite) los módulos son el estándar.
//13. Errores comunes de principiantes (y cómo evitarlos)
- Usar
==en vez de=== - Mutar arrays/objetos sin querer (compartir referencias)
- Olvidar
returnen funciones - No manejar errores en
fetch - Mezclar
asyncmal (awaitfuera de función async) - Confiar en el orden de
forEach+ async (mejorfor...of+ await) - Poner lógica de negocio gigante en un solo archivo
// ❌ malo
items.forEach(async (item) => {
await save(item);
});
// ✅ mejor
for (const item of items) {
await save(item);
}
//14. Mini proyecto: To-Do en el navegador
Objetivo: lista de tareas con localStorage.
Checklist de features:
- Agregar tarea
- Marcar completada
- Eliminar
- Persistir en
localStorage - Filtrar: todas / activas / hechas
Estructura sugerida:
const STORAGE_KEY = "todos-v1";
function loadTodos() {
try {
return JSON.parse(localStorage.getItem(STORAGE_KEY)) ?? [];
} catch {
return [];
}
}
function saveTodos(todos) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(todos));
}
function addTodo(text) {
const todos = loadTodos();
todos.push({ id: crypto.randomUUID(), text, done: false });
saveTodos(todos);
return todos;
}
Cuando lo termines, pásalo a módulos y luego a TypeScript.
//15. Plan de estudio de 4 semanas
| Semana | Enfoque | Entregable |
|---|---|---|
| 1 | Variables, tipos, funciones, arrays | 20 ejercicios cortos |
| 2 | Objetos, DOM, eventos | Contador + formulario validado |
| 3 | Async, fetch, JSON | App que consuma una API pública |
| 4 | Módulos + proyecto | To-Do completo con localStorage |
Ritmo recomendado: 45–90 min/día. Mejor poca práctica diaria que maratones de domingo.
//16. Qué estudiar después de esta guía
- TypeScript — mismos conceptos, menos bugs
- HTML/CSS sólidos — para UI de verdad
- Un framework (React o Next.js)
- Git + GitHub
- Algoritmos básicos (arrays, mapas, complejidad simple)
- Backend (Node/Nest + bases de datos)
En Programemos puedes seguir con las rutas de JavaScript, TypeScript y Python, además de ejercicios y comunidad.
//17. Glosario rápido (para no perderte)
| Término | Significado simple |
|---|---|
| Runtime | Dónde se ejecuta tu código (navegador, Node) |
| Hoisting | JS “eleva” declaraciones antes de ejecutar |
| Callback | Función que pasas para que otra la ejecute después |
| Promise | Representa un valor futuro (éxito o error) |
| Event loop | Mecanismo que coordina tareas sync/async |
| Scope | Dónde una variable es visible |
| Mutación | Cambiar un objeto/array existente en memoria |
| JSON | Formato de datos texto (objetos/arrays) |
| API | Interfaz para hablar con un servidor u otro sistema |
| Bundle | Empaquetado de archivos JS para producción |
//18. 25 ejercicios para practicar (hazlos sin mirar la solución)
- Convierte Celsius ↔ Fahrenheit.
- Detecta si un string es palíndromo.
- Cuenta vocales en un texto.
- Encuentra el máximo de un array sin
Math.max(...). - Invierte un array sin
.reverse(). - Elimina duplicados de un array.
- Agrupa números pares e impares.
- Calcula factorial con recursión.
- Genera la secuencia de Fibonacci hasta N.
- Valida un email simple con includes/
@. - Capitaliza cada palabra de una frase.
- Aplana un array de arrays un nivel.
- Cuenta frecuencia de palabras en un texto.
- Implementa
mapusandofor. - Implementa
filterusandofor. - Debounce simple con
setTimeout. - Deep clone superficial vs
structuredClone. - Ordena objetos por una propiedad.
- Busca un usuario por id en un array.
- Suma el total de un carrito (
price * qty). - Pagina un array (
page,limit). - Convierte query string ↔ objeto.
- Reintenta un
fetchfallido 3 veces. - Crea un contador con closure.
- Mini agenda: alta/baja/listado en memoria.
Si te trabas más de 20 minutos, mira docs/MDN, no un tutorial completo. El músculo está en resolver.
//19. Proyecto 2: “Dev Blog Reader” (consume una API)
Más ambicioso que el To-Do. Construye una página que:
- Pida posts a una API (
fetch) - Muestre tarjetas (título + excerpt)
- Permita buscar por texto
- Guarde favoritos en
localStorage - Tenga estados: loading / error / vacío / éxito
Boceto de estado:
const state = {
posts: [],
favorites: new Set(JSON.parse(localStorage.getItem("favs") ?? "[]")),
query: "",
status: "idle", // idle | loading | error | success
};
async function loadPosts() {
state.status = "loading";
render();
try {
const res = await fetch("https://jsonplaceholder.typicode.com/posts?_limit=20");
if (!res.ok) throw new Error("HTTP " + res.status);
state.posts = await res.json();
state.status = "success";
} catch (e) {
console.error(e);
state.status = "error";
}
render();
}
Este proyecto te prepara para frameworks: mismo modelo mental (estado → UI).
//20. Cómo depurar como profesional (aunque seas principiante)
- Reproduce el bug en el caso más pequeño posible
console.logcon etiquetas claras (console.log("user", user))- Usa breakpoints en DevTools (Sources)
- Lee el stack trace de arriba hacia abajo
- Verifica tipos/valores justo antes del crash
- No cambies 10 cosas a la vez
Truco: si “a veces falla”, registra inputs. Los bugs intermitentes casi siempre son datos inesperados (null, array vacío, race conditions).
//21. Recursos oficiales (calidad > cantidad)
- MDN JavaScript
- javascript.info (excelente ruta)
- ECMAScript release notes (para features nuevas)
- Node.js docs si vas a backend
Evita saltar entre 12 cursos a la vez. Elige una ruta y termínala.
//Conclusión
JavaScript no se “termina” de aprender: se practica. Si dominas variables, funciones, arrays/objetos, DOM y asincronía, ya tienes la base para frontend, backend y herramientas modernas.
Tu siguiente paso concreto:
- Haz el mini To-Do
- Completa al menos 10 ejercicios de la lista
- Sube el repo a GitHub
- Escribe un post corto explicando qué aprendiste
- Empieza TypeScript o tu primera API
Cuando practiques con intención, dejas de “ver tutoriales” y empiezas a construir.
FAQ
¿Cuánto tiempo se necesita para aprender JavaScript desde cero?
Con 45–90 minutos diarios puedes tener una base sólida en 4–8 semanas si practicas con proyectos, no solo teoría.
¿Debo aprender HTML y CSS antes de JavaScript?
Ayuda mucho para el DOM y la UI, pero puedes aprender lo básico de HTML/CSS en paralelo con los primeros módulos de JS.
¿Java y JavaScript son lo mismo?
No. Son lenguajes distintos. JavaScript es el lenguaje de la web; Java es otro ecosistema (JVM) con sintaxis y usos diferentes.
¿Qué debo aprender después de JavaScript básico?
TypeScript, Git, un framework (React/Next), algoritmos básicos y luego backend con Node o NestJS.
¿Sirve practicar solo con tutoriales?
Los tutoriales ayudan al inicio, pero el aprendizaje real ocurre cuando construyes proyectos propios y resuelves errores sin un guía paso a paso.