Nivel 1: Variables
📖 Lectura
Las variables son contenedores que almacenan valores. En JavaScript, puedes declarar variables usando var
, let
o const
.
let nombre = "JavaScript";
const PI = 3.14159;
var edad = 25;
Tipos de declaración:
- let: Para variables que pueden cambiar su valor
- const: Para valores constantes que no cambian
- var: Forma antigua (evitar usar en código moderno)
Reglas importantes:
- Los nombres de variables son sensibles a mayúsculas y minúsculas
- Pueden contener letras, números, guiones bajos y símbolos de dólar
- No pueden empezar con números
- No pueden usar palabras reservadas de JavaScript
💡 Consejo
Usa nombres descriptivos para tus variables. En lugar de x
, usa edad
o nombreUsuario
.
Nivel 1: Variables - Ejercicio
⚔️ Ejercicio
Crea variables para tu personaje RPG. Usa diferentes tipos de declaración:
Instrucciones:
- Crea una variable
heroName
con tu nombre usandolet
- Crea una variable
heroLevel
con el valor 1 usandoconst
- Crea una variable
heroClass
con tu clase favorita (guerrero, mago, etc.) - Muestra todas las variables en la consola
Nivel 2: Funciones
📖 Lectura
Las funciones son bloques de código reutilizables que pueden recibir parámetros y retornar valores.
function saludar(nombre) {
return `¡Hola, ${nombre}!`;
}
// Función flecha (arrow function)
const sumar = (a, b) => a + b;
Tipos de funciones:
- Declaración:
function nombre() {}
- Expresión:
const nombre = function() {}
- Arrow function:
const nombre = () => {}
- Método: Función dentro de un objeto
💡 Consejo
Las arrow functions son más concisas y no tienen su propio this
. Usa nombres descriptivos para tus funciones.
Nivel 2: Funciones - Ejercicio
⚔️ Ejercicio
Crea funciones para tu personaje RPG:
Instrucciones:
- Crea una función
atacar
que reciba el nombre del enemigo - Crea una arrow function
curar
que reciba la cantidad de HP - Crea una función que calcule el daño basado en el nivel
- Prueba todas las funciones
Nivel 3: Arrays
📖 Lectura
Los arrays son estructuras de datos que almacenan múltiples valores en una sola variable. Son fundamentales para manejar colecciones de datos.
let inventario = ['Espada', 'Escudo', 'Poción'];
let numeros = [1, 2, 3, 4, 5];
let mixto = ['texto', 42, true, null];
Métodos importantes:
- push(): Agrega elementos al final
- pop(): Remueve el último elemento
- shift(): Remueve el primer elemento
- unshift(): Agrega elementos al inicio
- splice(): Modifica elementos en cualquier posición
💡 Consejo
Los arrays en JavaScript pueden contener elementos de diferentes tipos. Usa Array.isArray()
para verificar si una variable es un array.
Nivel 3: Arrays - Ejercicio
⚔️ Ejercicio
Crea y manipula arrays para tu inventario de RPG:
Instrucciones:
- Crea un array llamado
inventario
con algunos items - Agrega un nuevo item usando
push()
- Remueve el último item usando
pop()
- Muestra el inventario en la consola
Nivel 4: Objetos
📖 Lectura
Los objetos son estructuras de datos que almacenan pares clave-valor. Son fundamentales para representar entidades complejas.
let personaje = {
nombre: 'Aragorn',
clase: 'Guerrero',
nivel: 15,
salud: 100,
atacar: function() {
return '¡Ataque con espada!';
}
};
Acceso a propiedades:
- Notación de punto:
personaje.nombre
- Notación de corchetes:
personaje['nombre']
- Métodos: Funciones dentro del objeto
💡 Consejo
Los objetos son la base de la programación orientada a objetos en JavaScript. Usa Object.keys()
para obtener todas las claves.
Nivel 4: Objetos - Ejercicio
⚔️ Ejercicio
Crea un objeto para tu personaje RPG:
Instrucciones:
- Crea un objeto
personaje
con propiedades básicas - Agrega un método
saludar()
que retorne un mensaje - Accede a las propiedades usando ambas notaciones
- Muestra la información en la consola
Nivel 5: Scope
📖 Lectura
El scope (alcance) determina dónde las variables son accesibles en tu código. JavaScript tiene scope global, de función y de bloque.
let globalVar = 'Soy global';
function miFuncion() {
let localVar = 'Soy local';
console.log(globalVar); // ✅ Accesible
console.log(localVar); // ✅ Accesible
}
console.log(globalVar); // ✅ Accesible
console.log(localVar); // ❌ Error: no definida
Tipos de scope:
- Global: Variables accesibles en todo el código
- Función: Variables solo accesibles dentro de la función
- Bloque: Variables solo accesibles dentro de bloques {}
💡 Consejo
Usa let
y const
para evitar problemas de hoisting. Las variables declaradas con var
tienen scope de función, no de bloque.
Nivel 5: Scope - Ejercicio
⚔️ Ejercicio
Experimenta con diferentes tipos de scope:
Instrucciones:
- Crea una variable global
nombreJugador
- Crea una función que declare una variable local
- Usa un bloque con
let
para crear una variable de bloque - Prueba acceder a las variables desde diferentes scopes
Nivel 6: Hoisting
📖 Lectura
El hoisting es el comportamiento de JavaScript de mover declaraciones al inicio de su scope antes de la ejecución del código.
// Esto funciona debido al hoisting
console.log(miVariable); // undefined
var miVariable = 'Hola';
// Esto NO funciona
console.log(miLet); // Error
let miLet = 'Hola';
Comportamiento del hoisting:
- var: Se eleva la declaración, no la inicialización
- let/const: Se elevan pero no se inicializan (Temporal Dead Zone)
- funciones: Se elevan completamente
💡 Consejo
Evita el hoisting declarando todas las variables al inicio de su scope. Usa let
y const
para un comportamiento más predecible.
Nivel 6: Hoisting - Ejercicio
⚔️ Ejercicio
Experimenta con el comportamiento del hoisting:
Instrucciones:
- Prueba acceder a una variable
var
antes de declararla - Prueba acceder a una variable
let
antes de declararla - Declara una función y llámala antes de su declaración
- Observa las diferencias en el comportamiento
Nivel 7: Closures
📖 Lectura
Un closure es una función que tiene acceso a variables de su scope exterior, incluso después de que la función exterior haya terminado de ejecutarse.
function crearContador() {
let contador = 0;
return function() {
contador++;
return contador;
};
}
let miContador = crearContador();
console.log(miContador()); // 1
console.log(miContador()); // 2
Características de los closures:
- Acceso a variables externas: Mantienen referencia a variables del scope padre
- Estado privado: Permiten crear variables "privadas"
- Memoria: Las variables se mantienen en memoria mientras exista la referencia
💡 Consejo
Los closures son útiles para crear funciones con estado, callbacks y módulos. Ten cuidado con las fugas de memoria si no liberas las referencias.
Nivel 7: Closures - Ejercicio
⚔️ Ejercicio
Crea closures para manejar el estado de tu personaje:
Instrucciones:
- Crea una función que genere un contador de experiencia
- Crea una función que maneje el inventario privado
- Prueba acceder a las variables "privadas" desde fuera
- Observa cómo se mantiene el estado
Nivel 8: Callbacks
📖 Lectura
Un callback es una función que se pasa como argumento a otra función y se ejecuta después de que la función principal haya terminado.
function procesarDatos(datos, callback) {
console.log('Procesando datos...');
let resultado = datos.toUpperCase();
callback(resultado);
}
function mostrarResultado(resultado) {
console.log('Resultado:', resultado);
}
procesarDatos('hola mundo', mostrarResultado);
Usos comunes de callbacks:
- Operaciones asíncronas: Manejo de respuestas de APIs
- Eventos: Respuesta a clicks, teclas, etc.
- Filtros y mapeo: Personalización de operaciones
- Timers: Ejecución retardada
💡 Consejo
Los callbacks son fundamentales para JavaScript asíncrono. Ten cuidado con el "callback hell" - usa Promises o async/await para operaciones complejas.
Nivel 8: Callbacks - Ejercicio
⚔️ Ejercicio
Crea funciones que usen callbacks para simular operaciones de juego:
Instrucciones:
- Crea una función que simule cargar datos de un personaje
- Usa callbacks para manejar el éxito y error
- Crea una función que filtre un array usando callback
- Simula un timer con callback
Nivel 9: Promises
📖 Lectura
Las Promises son objetos que representan la eventual finalización (o fallo) de una operación asíncrona y su valor resultante.
let miPromise = new Promise((resolve, reject) => {
let exito = true;
if (exito) {
resolve('Operación exitosa');
} else {
reject('Error en la operación');
}
});
miPromise
.then(resultado => console.log(resultado))
.catch(error => console.log(error));
Estados de una Promise:
- Pending: Estado inicial, ni cumplida ni rechazada
- Fulfilled: Operación completada exitosamente
- Rejected: Operación falló
💡 Consejo
Las Promises evitan el "callback hell" y hacen el código asíncrono más legible. Usa async/await
para una sintaxis aún más limpia.
Nivel 9: Promises - Ejercicio
⚔️ Ejercicio
Crea Promises para simular operaciones de juego asíncronas:
Instrucciones:
- Crea una Promise que simule cargar datos de un servidor
- Usa .then() y .catch() para manejar el resultado
- Crea una Promise que simule una operación que puede fallar
- Usa Promise.all() para múltiples operaciones
Nivel 10: Async/Await
📖 Lectura
Async/await es una forma más elegante de trabajar con Promises, permitiendo escribir código asíncrono que se ve como código síncrono.
async function cargarUsuario() {
try {
const respuesta = await fetch('/api/usuario');
const usuario = await respuesta.json();
return usuario;
} catch (error) {
console.log('Error:', error);
}
}
// Uso
cargarUsuario().then(usuario => {
console.log(usuario);
});
Características de async/await:
- async: Declara una función asíncrona que retorna una Promise
- await: Pausa la ejecución hasta que la Promise se resuelve
- try/catch: Manejo de errores más natural
- Legibilidad: Código más fácil de leer y entender
💡 Consejo
Async/await es la forma moderna de manejar operaciones asíncronas. Siempre usa try/catch para manejar errores y evita await en bucles cuando sea posible.
Nivel 10: Async/Await - Ejercicio
⚔️ Ejercicio
Convierte código con Promises a async/await:
Instrucciones:
- Crea una función async que simule cargar datos
- Usa await para esperar múltiples operaciones
- Implementa manejo de errores con try/catch
- Crea una función que procese datos secuencialmente