🧙‍♂️
Nivel: 1
XP: 0
Conceptos: 0/33

"The Road" A JavaScript Adventure

Los 33 Conceptos que Todo Programador Debe Conocer

Basado en el artículo de Stephen Curtis

Nivel 1: Variables

Básico

📖 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

Práctica

⚔️ Ejercicio

Crea variables para tu personaje RPG. Usa diferentes tipos de declaración:

Instrucciones:

  1. Crea una variable heroName con tu nombre usando let
  2. Crea una variable heroLevel con el valor 1 usando const
  3. Crea una variable heroClass con tu clase favorita (guerrero, mago, etc.)
  4. Muestra todas las variables en la consola
Editor de Código
Consola

Nivel 2: Funciones

Básico

📖 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

Práctica

⚔️ Ejercicio

Crea funciones para tu personaje RPG:

Instrucciones:

  1. Crea una función atacar que reciba el nombre del enemigo
  2. Crea una arrow function curar que reciba la cantidad de HP
  3. Crea una función que calcule el daño basado en el nivel
  4. Prueba todas las funciones
Editor de Código
Consola

Nivel 3: Arrays

Básico

📖 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

Práctica

⚔️ Ejercicio

Crea y manipula arrays para tu inventario de RPG:

Instrucciones:

  1. Crea un array llamado inventario con algunos items
  2. Agrega un nuevo item usando push()
  3. Remueve el último item usando pop()
  4. Muestra el inventario en la consola
Editor de Código
Consola

Nivel 4: Objetos

Básico

📖 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

Práctica

⚔️ Ejercicio

Crea un objeto para tu personaje RPG:

Instrucciones:

  1. Crea un objeto personaje con propiedades básicas
  2. Agrega un método saludar() que retorne un mensaje
  3. Accede a las propiedades usando ambas notaciones
  4. Muestra la información en la consola
Editor de Código
Consola

Nivel 5: Scope

Intermedio

📖 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

Práctica

⚔️ Ejercicio

Experimenta con diferentes tipos de scope:

Instrucciones:

  1. Crea una variable global nombreJugador
  2. Crea una función que declare una variable local
  3. Usa un bloque con let para crear una variable de bloque
  4. Prueba acceder a las variables desde diferentes scopes
Editor de Código
Consola

Nivel 6: Hoisting

Intermedio

📖 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

Práctica

⚔️ Ejercicio

Experimenta con el comportamiento del hoisting:

Instrucciones:

  1. Prueba acceder a una variable var antes de declararla
  2. Prueba acceder a una variable let antes de declararla
  3. Declara una función y llámala antes de su declaración
  4. Observa las diferencias en el comportamiento
Editor de Código
Consola

Nivel 7: Closures

Avanzado

📖 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

Práctica

⚔️ Ejercicio

Crea closures para manejar el estado de tu personaje:

Instrucciones:

  1. Crea una función que genere un contador de experiencia
  2. Crea una función que maneje el inventario privado
  3. Prueba acceder a las variables "privadas" desde fuera
  4. Observa cómo se mantiene el estado
Editor de Código
Consola

Nivel 8: Callbacks

Intermedio

📖 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

Práctica

⚔️ Ejercicio

Crea funciones que usen callbacks para simular operaciones de juego:

Instrucciones:

  1. Crea una función que simule cargar datos de un personaje
  2. Usa callbacks para manejar el éxito y error
  3. Crea una función que filtre un array usando callback
  4. Simula un timer con callback
Editor de Código
Consola

Nivel 9: Promises

Avanzado

📖 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

Práctica

⚔️ Ejercicio

Crea Promises para simular operaciones de juego asíncronas:

Instrucciones:

  1. Crea una Promise que simule cargar datos de un servidor
  2. Usa .then() y .catch() para manejar el resultado
  3. Crea una Promise que simule una operación que puede fallar
  4. Usa Promise.all() para múltiples operaciones
Editor de Código
Consola

Nivel 10: Async/Await

Avanzado

📖 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

Práctica

⚔️ Ejercicio

Convierte código con Promises a async/await:

Instrucciones:

  1. Crea una función async que simule cargar datos
  2. Usa await para esperar múltiples operaciones
  3. Implementa manejo de errores con try/catch
  4. Crea una función que procese datos secuencialmente
Editor de Código
Consola