Ejercicios propuesto por tema
let, const, y diferencias con var
Reto 1: "¿Quién puede cambiar?"
Nivel: Básico
Tiempo estimado de resolución: 10 minutos Participantes: Individual
Enunciado: Declara tres variables para representar la edad de una persona usando var
, let
y const
. Luego intenta modificar su valor. Observa el comportamiento de cada tipo de declaración.
Resultado esperado: El código debe demostrar claramente cuál de las variables puede modificarse y cuál lanza error. Ejemplo:
var edad1 = 25;
let edad2 = 30;
const edad3 = 35;
edad1 = 26;
edad2 = 31;
edad3 = 36; // Error
Pistas o ayudas: Recuerda que const
define una constante que no puede cambiar su valor.
Reto 2: "¡Cuidado con el hoisting!"
Nivel: Medio
Tiempo estimado de resolución: 15 minutos Participantes: Individual
Enunciado: Escribe un bloque de código donde declares una variable con var
y otra con let
dentro de una función. Intenta acceder a las variables antes de su declaración.
Resultado esperado: El código debe mostrar cómo el hoisting afecta a var
y let
, reflejando un undefined
o un error. Ejemplo:
function testScope() {
console.log(a); // undefined
console.log(b); // ReferenceError
var a = 1;
let b = 2;
}
Pistas o ayudas:
- JavaScript "mueve" las declaraciones
var
al inicio, pero no sus inicializaciones. - Las variables
let
yconst
se encuentran en "zona muerta temporal".
Reto 3: "Área restringida"
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: En parejas
Enunciado: Crea una función que reciba un número y retorne si es par o impar. Declara una variable auxiliar dentro del if
usando var
, y en otro bloque usa let
. Analiza cuál variable es visible fuera del bloque.
Resultado esperado: Diferencia clara entre el comportamiento de var
(visible fuera del bloque) y let
(solo dentro del bloque).
Pistas o ayudas:
- Prueba imprimir las variables fuera del
if
oelse
. - Usa bloques
{}
para delimitar mejor el alcance.
Reto 4: "¡Congela tus datos!"
Nivel: Avanzado
Tiempo estimado de resolución: 25 minutos
Participantes: Individual
Enunciado: Declara un objeto con const
y luego intenta modificar uno de sus atributos. Luego intenta reasignar completamente el objeto. Explica los resultados.
Resultado esperado:
- Se permite modificar las propiedades del objeto.
- No se permite reasignar el objeto completo.
Ejemplo:
const persona = { nombre: "Ana", edad: 22 };
persona.edad = 23; // OK
persona = { nombre: "Luis", edad: 30 }; // Error
Pistas o ayudas:
const
evita la reasignación, no la modificación interna de objetos.- Para evitar modificaciones internas, investiga
Object.freeze()
.
Reto 5: "Simulando un formulario"
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: En grupo
Enunciado: Simula un formulario web que recibe nombre, edad y correo electrónico. Declara variables adecuadas para cada dato, elige entre let
y const
justificando tu elección. Luego, simula cambios en los datos por parte del usuario y explica qué datos deben permanecer constantes y cuáles pueden cambiar.
Resultado esperado: Un programa que use correctamente let para variables que pueden cambiar y const para referencias estables. Ejemplo (simplificado):
const form = {};
let nombre = "Ana";
let edad = 25;
let correo = "<ana@mail.com>";
// Usuario cambia nombre y edad
nombre = "Laura";
edad = 26;
Pistas o ayudas:
- Reflexiona qué datos nunca cambian y cuáles sí.
- Justifica el uso de
let
oconst
según el ciclo de vida del dato.
Arrow functions y contexto del this
Reto 1: "Tu primera flecha"
Nivel: Básico
Tiempo estimado de resolución: 10 minutos
Participantes: Individual
Enunciado: Convierte una función tradicional que suma dos números en una arrow function.
Resultado esperado: El código debe funcionar correctamente con la sintaxis de flecha:
const suma = (a, b) => a + b;
console.log(suma(3, 5)); // 8
Pistas o ayudas:
- Las arrow functions no requieren
return
explícito si es una línea. - No uses llaves
{}
si el cuerpo de la función es una sola expresión.
Reto 2: "¿Quién es this?"
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: Individual
Enunciado: Crea un objeto reloj con un método tradicional que muestre la hora usando setInterval
. Luego, reescribe el método usando arrow function y analiza el resultado.
Resultado esperado: El primer ejemplo no accederá correctamente al this
.hora, pero el segundo sí lo hará porque las arrow functions no reescriben el this
.
const reloj = {
hora: 12,
iniciar: function () {
setInterval(() => {
console.log("Hora actual:", this.hora);
}, 1000);
}
};
Pistas o ayudas:
- Las arrow functions heredan el
this
del contexto donde fueron creadas. - Usa
console.log(this)
dentro de ambos métodos para comparar.
Reto 3: "Filtrando favoritos"
Nivel: Medio
Tiempo estimado de resolución: 15 minutos
Participantes: En parejas
Enunciado: Dado un array de objetos con películas, filtra solo las que tengan más de 8 puntos de calificación usando arrow functions.
Resultado esperado: Un nuevo array con películas que cumplen la condición. Ejemplo:
const peliculas = [
{ titulo: "Inception", puntuacion: 9 },
{ titulo: "Avatar", puntuacion: 7 }
];
const favoritas = peliculas.filter(p => p.puntuacion > 8);
// [{ titulo: "Inception", puntuacion: 9 }]
Pistas o ayudas:
- Usa
.filter()
con una arrow function como parámetro. - No uses return si es una condición simple.
Reto 4: "Comparando contextos"
Nivel: Avanzado
Tiempo estimado de resolución: 25 minutos
Participantes: Individual
Enunciado: Crea un objeto con un método llamado mostrarNombre
, que declare una función interna para mostrar el nombre. Hazlo con una función tradicional y luego con una arrow function.
Resultado esperado: Solo el segundo ejemplo con arrow function accede correctamente al this.nombre
.
const persona = {
nombre: "Luis",
mostrarNombre: function () {
const imprimir = () => {
console.log("Nombre:", this.nombre);
};
imprimir();
}
};
Pistas o ayudas:
- Recuerda que this en funciones tradicionales depende de cómo se llama la fu- , no de dónde está.
- Las arrow functions heredan this del entorno externo.
Reto 5: "Mi equipo favorito"
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: En grupo
Enunciado: Crea una clase Equipo
que contenga el nombre del equipo y un arreglo de jugadores. Implementa un método listarJugadores()
que imprima el nombre del equipo junto con cada jugador. Usa forEach
y arrow functions para evitar errores con this
.
Resultado esperado: El método imprime correctamente el nombre del equipo y los jugadores, sin errores de contexto.
class Equipo {
constructor(nombre, jugadores) {
this.nombre = nombre;
this.jugadores = jugadores;
}
listarJugadores() {
this.jugadores.forEach(j => {
console.log(`${this.nombre} - ${j}`);
});
}
}
Pistas o ayudas:
- Intenta hacerlo primero con una función tradicional y observa el error con
this
. - Luego usa arrow functions para corregirlo.
Destructuring (arrays y objetos)
Reto 1: “Intercambio Express”
Nivel: Básico
Tiempo estimado de resolución: 10 minutos
Participantes: Individual
Enunciado: Usa destructuring para intercambiar los valores de dos variables a = 10
y b = 20
, sin usar una variable temporal.
Resultado esperado: Debe mostrar:
a = 20
b = 10
Pistas o ayudas:
- Recuerda que puedes desestructurar arrays de esta forma:
[x, y] = [y, x];
Reto 2: “¡Dame los datos!”
Nivel: Medio
Tiempo estimado de resolución: 15 minutos
Participantes: En parejas
Enunciado: Dado un objeto:
const persona = { nombre: "Carlos", edad: 28, ciudad: "Bogotá" };
Extrae los valores nombre y ciudad en variables independientes usando destructuring. Luego imprime una frase como:
Carlos vive en Bogotá.
Resultado esperado: Frase construida con las variables extraídas.
const { nombre, ciudad } = persona;
console.log(`${nombre} vive en ${ciudad}.`);
Pistas o ayudas:
- Usa
{}
para desestructurar objetos. - Puedes extraer solo las propiedades que necesitas.
Reto 3: “Top 3 jugadores”
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: Individual
Enunciado: Tienes un arreglo con los nombres de los 5 mejores jugadores:
const jugadores = ["Messi", "Mbappé", "Haaland", "Modric", "Salah"];
Extrae los tres primeros usando destructuring y almacénalos en variables individuales. Luego imprime una frase tipo:
El primero es Messi, seguido por Mbappé y Haaland.
Resultado esperado:
const [primero, segundo, tercero] = jugadores;
console.log(`El primero es ${primero}, seguido por ${segundo} y ${tercero}.`);
Pistas o ayudas:
- Usa
[]
para desestructurar arrays. - El orden de los elementos es importante.
Reto 4: “Combinando datos”
Nivel: Avanzado
Tiempo estimado de resolución: 25 minutos
Participantes: En grupo
Enunciado: Dado el siguiente objeto anidado:
const usuario = {
id: 1,
perfil: {
nombre: "Lucía",
contacto: {
correo: "<lucia@example.com>",
telefono: "123456789"
}
}
};
Extrae en variables independientes: nombre, correo y telefono, usando destructuring anidado.
Resultado esperado:
const { perfil: { nombre, contacto: { correo, telefono } } } = usuario;
console.log(nombre, correo, telefono);
Pistas o ayudas:
- Puedes hacer destructuring dentro de destructuring.
- La sintaxis puede parecer compleja, pero sigue la estructura del objeto.
Reto 5: “Configuración flexible”
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: Individual
Enunciado: Crea una función que reciba un objeto con configuración:
const config = { modo: "oscuro", idioma: "es", notificaciones: true };
Usa destructuring con valores por defecto dentro del parámetro de la función. Luego imprime un resumen de la configuración.
Resultado esperado: La función debe imprimir algo como:
Modo: oscuro, Idioma: es, Notificaciones: activadas.
Incluso si se omiten algunas propiedades:
mostrarConfig({ modo: "claro" });
// Modo: claro, Idioma: en, Notificaciones: desactivadas.
Pistas o ayudas:
- Usa destructuring en los parámetros de la función.
- Usa valores por defecto como
{ idioma = 'en', notificaciones = false }
.
Operador spread y rest
Reto 1: “Un nuevo comienzo”
Nivel: Básico
Tiempo estimado de resolución: 10 minutos
Participantes: Individual
Enunciado: Tienes el siguiente array:
const numerosOriginales = [1, 2, 3];
Crea una nueva lista nuevosNumeros
que incluya los elementos de numerosOriginales
seguidos por 4, 5, 6
, sin modificar el array original.
Resultado esperado:
[1, 2, 3, 4, 5, 6]
Pistas o ayudas:
- Usa el operador spread para copiar el contenido del array original.
- No uses
.push()
directamente sobre el array original.
Reto 2: “Bienvenidos al evento”
Nivel: Medio
Tiempo estimado de resolución: 15 minutos
Participantes: En parejas
Enunciado: Tienes dos arrays con listas de invitados:
const invitadosVIP = ["Ana", "Luis"];
const invitadosGenerales = ["Carlos", "María"];
Crea un nuevo array todosLosInvitados
uniendo ambas listas en un solo array, pero asegurándote de que los VIP aparezcan primero.
Resultado esperado:
["Ana", "Luis", "Carlos", "María"]
Pistas o ayudas:
- Usa spread con ambos arrays al crear el nuevo.
Reto 3: “Sumadora flexible”
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: Individual
Enunciado: Crea una función sumarTodo
que reciba cualquier cantidad de números como argumentos y retorne su suma total.
Resultado esperado:
sumarTodo(1, 2, 3); // 6
sumarTodo(10, 20, 30, 40); // 100
Pistas o ayudas:
- Usa el operador rest
...
en los parámetros de la función. - Recorre el array generado para sumar todos los elementos.
Reto 4: “Separando al líder”
Nivel: Avanzado
Tiempo estimado de resolución: 25 minutos
Participantes: En grupo
Enunciado: Dado el siguiente array con posiciones en una carrera:
const posiciones = ["Laura", "Pedro", "Marta", "Andrés", "Sofía"];
Usa destructuring y el operador rest para separar al primer lugar (ganador) y guardar el resto en restoDelGrupo
.
Resultado esperado:
ganador = "Laura"
restoDelGrupo = ["Pedro", "Marta", "Andrés", "Sofía"]
Pistas o ayudas:
- Combina destructuring con
...rest
en arrays. - El operador rest debe ir al final en un array destructurado.
Reto 5: “Fusionando configuración”
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: Individual
Enunciado: Tienes una configuración por defecto:
const configDefault = { idioma: "es", modo: "claro", notificaciones: true };
Y una configuración del usuario:
const configUsuario = { modo: "oscuro", notificaciones: false };
Fusiona ambas en un nuevo objeto configFinal
, donde los valores de configUsuario
sobrescriban los de configDefault
.
Resultado esperado:
{ idioma: "es", modo: "oscuro", notificaciones: false }
Pistas o ayudas:
- El orden de los objetos con spread es importante: el último sobrescribe.
- Usa
{ ...obj1, ...obj2 }
para combinar propiedades.
Template literals
Reto 1: “Hola, nombre”
Nivel: Básico
Tiempo estimado de resolución: 10 minutos
Participantes: Individual
Enunciado: Declara una variable nombre con tu nombre y usa un template literal para imprimir en consola:
¡Hola, [nombre]! Bienvenido al curso de JavaScript.
Resultado esperado:
const nombre = "Sofía";
console.log(`¡Hola, ${nombre}! Bienvenido al curso de JavaScript.`);
Pistas o ayudas:
- Los template literals se escriben con backticks
``
. - Usa
${}
para interpolar variables dentro del texto.
Reto 2: “Factura rápida”
Nivel: Medio
Tiempo estimado de resolución: 15 minutos
Participantes: En parejas
Enunciado: Dado un objeto:
const producto = { nombre: "Mouse", precio: 50000, cantidad: 2 };
Usa template literals para imprimir un mensaje como:
Compraste 2 Mouse(s) por un total de $100000.
Resultado esperado: El total debe calcularse dentro del template literal.
`Compraste ${producto.cantidad} ${producto.nombre}(s) por un total de $${producto.precio * producto.cantidad}.`
Pistas o ayudas:
- Puedes realizar operaciones matemáticas dentro de
${}
. - Usa objetos con propiedades bien nombradas para mayor claridad.
Reto 3: “Currículum en una línea”
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: Individual
Enunciado: Crea una función que reciba tres parámetros: nombre, carrera y universidad. Devuelve una frase usando template literals:
Mi nombre es [nombre], estudio [carrera] en la universidad [universidad].
Resultado esperado:
function presentar(nombre, carrera, universidad) {
return `Mi nombre es ${nombre}, estudio ${carrera} en la universidad ${universidad}.`;
}
Pistas o ayudas:
- Este reto combina template literals con funciones.
- Usa nombres de parámetros descriptivos.
Reto 4: “Múltiples líneas con estilo”
Nivel: Avanzado
Tiempo estimado de resolución: 25 minutos
Participantes: En grupo
Enunciado: Crea una plantilla HTML en una variable usando template literals que incluya:
- Título
- Un párrafo de bienvenida
- Una lista de 3 elementos
- El contenido debe estar dentro de una variable
htmlContent
.
Resultado esperado: Una estructura como:
const htmlContent = `
<h1>Bienvenido</h1>
<p>Gracias por visitar nuestro sitio.</p>
<ul>
<li>Inicio</li>
<li>Servicios</li>
<li>Contacto</li>
</ul>
`;
Pistas o ayudas:
- Los template literals permiten saltos de línea fácilmente.
- Úsalos para crear HTML, emails, y otros textos largos.
Reto 5: “Resumen de resultados”
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: Individual
Enunciado: Dado el siguiente array de estudiantes:
const estudiantes = [
{ nombre: "Carlos", nota: 4.5 },
{ nombre: "Luisa", nota: 3.8 },
{ nombre: "Mario", nota: 4.9 }
];
Escribe una función que retorne un resumen tipo texto con los resultados de cada estudiante, usando template literals y .map()
.
Resultado esperado: Un string como:
Carlos obtuvo 4.5
Luisa obtuvo 3.8
Mario obtuvo 4.9
Pistas o ayudas:
- Usa
.map()
para transformar cada estudiante en un string. - Une todos los resultados con
.join('\n')
para obtener múltiples líneas.
Clases y herencia
Reto 1: “Crea tu primera clase”
Nivel: Básico
Tiempo estimado de resolución: 15 minutos
Participantes: Individual
Enunciado: Crea una clase llamada Persona
con un constructor que reciba nombre y edad. Agrega un método saludar()
que imprima:
Hola, mi nombre es [nombre] y tengo [edad] años.
Resultado esperado:
const persona1 = new Persona("Laura", 22);
persona1.saludar(); // Hola, mi nombre es Laura y tengo 22 años.
Pistas o ayudas:
- Usa
constructor()
dentro de la clase. - Los métodos no necesitan la palabra
function
.
Reto 2: “Animal parlante”
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: Individual
Enunciado: Crea una clase Animal
con un método hacerSonido()
. Luego crea una subclase Perro
que herede de Animal
y sobrescriba hacerSonido()
para imprimir:
El perro dice: ¡Guau!
Resultado esperado:
const dog = new Perro();
dog.hacerSonido(); // El perro dice: ¡Guau!
Pistas o ayudas:
- Usa extends para heredar.
- Para sobrescribir un método, usa el mismo nombre en la subclase.
- Si deseas usar el comportamiento de la clase padre también, llama a super.hacerSonido() dentro del hijo.
Reto 3: “Usuarios registrados”
Nivel: Medio
Tiempo estimado de resolución: 25 minutos
Participantes: En parejas
Enunciado: Crea una clase Usuario
con propiedades usuario y correo. Luego crea una subclase Admin
que también reciba permisos (array). Agrega un método mostrarInfo()
que muestre toda la información.
Resultado esperado:
const admin = new Admin("jadmin", "<admin@mail.com>", ["modificar", "eliminar"]);
admin.mostrarInfo();
// Usuario: jadmin
// Correo: <admin@mail.com>
// Permisos: modificar, eliminar
Pistas o ayudas:
- Usa
super()
en el constructor de la subclase para llamar al constructor deUsuario
. - Puedes usar
.join(', ')
para mostrar los permisos como texto.
Reto 4: “Vehículos en acción”
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: En grupo
Enunciado: Crea una clase Vehiculo
con métodos encender()
y apagar()
. Luego crea subclases Carro
y Moto
que tengan su propio método sonarBocina()
con sonidos distintos. Instancia ambos y simula que se encienden, hacen sonar la bocina y se apagan.
Resultado esperado:
const c = new Carro();
c.encender(); // Vehículo encendido.
c.sonarBocina(); // ¡Beep beep!
c.apagar(); // Vehículo apagado.
Pistas o ayudas:
- Cada subclase puede tener métodos propios además de los heredados.
- Puedes crear un método común en
Vehiculo
y luego extender su funcionalidad en las subclases.
Reto 5: “Sistema académico”
Nivel: Avanzado
Tiempo estimado de resolución: 35 minutos
Participantes: Individual
Enunciado: Crea una jerarquía de clases:
- Persona (nombre, documento)
- Estudiante (código, programa)
- Profesor (asignatura, facultad)
Agrega un método presentarse()
que sea redefinido en cada clase para mostrar información distinta.
Resultado esperado:
const profe = new Profesor("Mario", "123", "POO", "Ingeniería");
profe.presentarse(); // Soy Mario, profesor de POO en la facultad de Ingeniería.
Pistas o ayudas:
- Usa
super()
para reutilizar código del constructor padre. - Cada clase puede tener su propia versión del método
presentarse()
(polimorfismo).
Módulos (import/export)
Reto 1: “Tu primera exportación”
Nivel: Básico
Tiempo estimado de resolución: 10 minutos
Participantes: Individual
Enunciado: Crea un archivo llamado saludo.js
que exporte una función saludar(nombre)
que imprima:
¡Hola, [nombre]!
Luego crea un archivo app.js
que la importe y la ejecute.
Resultado esperado:
export function saludar(nombre) {
console.log(`¡Hola, ${nombre}!`);
}
import { saludar } from "./saludo.js";
saludar("Camila"); // ¡Hola, Camila!
Pistas o ayudas:
- Usa
export
para funciones y constantes reutilizables. - Asegúrate de que los archivos usen extensión
.js
y tengan tipomodule
si usas Node o navegador.
Reto 2: “Calculadora modular”
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: En parejas
Enunciado: Crea un archivo operaciones.js
con funciones sumar
, restar
, multiplicar
y dividir
. Exporta todas y úsalas desde main.js
, mostrando los resultados en consola.
Resultado esperado:
export function sumar(a, b) { return a + b; }
export function restar(a, b) { return a - b; }
export function multiplicar(a, b) { return a * b; }
export function dividir(a, b) { return a / b; }
import { sumar, restar, multiplicar, dividir } from "./operaciones.js";
console.log(sumar(2, 3)); // 5
Pistas o ayudas:
- Puedes usar
export
por separado o todos juntos al final. - Los nombres de las funciones deben coincidir al importar.
Reto 3: “Exportación por defecto”
Nivel: Medio
Tiempo estimado de resolución: 15 minutos
Participantes: Individual
Enunciado: Crea una clase Usuario
en el archivo usuario.js
y expórtala como default. Luego impórtala desde app.js
y crea una instancia.
Resultado esperado:
export default class Usuario {
constructor(nombre) {
this.nombre = nombre;
}
saludar() {
console.log(`Hola, soy ${this.nombre}`);
}
}
import Usuario from "./usuario.js";
const user = new Usuario("Andrés");
user.saludar(); // Hola, soy Andrés
Pistas o ayudas:
- Solo puede haber una exportación default por archivo.
- No uses llaves
{}
al importar una exportación por defecto.
Reto 4: “Paquete de utilidades”
Nivel: Avanzado
Tiempo estimado de resolución: 25 minutos
Participantes: En grupo
Enunciado: Crea un módulo utilidades.js
que contenga múltiples funciones:
capitalizar(str)
: convierte la primera letra en mayúscula.esPar(n)
: retorna true si el número es par.formatearMoneda(valor)
: retorna el valor con$
y separadores.
Usa estas funciones desde analisis.js
para procesar un array de usuarios con nombre y saldo.
Resultado esperado:
capitalizar("ana"); // "Ana"
esPar(4); // true
formatearMoneda(10000); // "$10,000"
Pistas o ayudas:
- Usa funciones puras, reutilizables.
- Organiza las exportaciones con
export { ... }
.
Reto 5: “Proyecto modular”
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: Individual
Enunciado: Divide un mini proyecto en los siguientes módulos:
datos.js
: exporta un array de productos.filtros.js
: exporta funcionesfiltrarPorPrecio
ybuscarPorNombre
.app.js
: importa los datos y funciones, y muestra los resultados de los filtros en consola.
Resultado esperado:
export const productos = [
{ nombre: "Mouse", precio: 30000 },
{ nombre: "Teclado", precio: 80000 }
];
export function filtrarPorPrecio(lista, min) {
return lista.filter(p => p.precio >= min);
}
export function buscarPorNombre(lista, texto) {
return lista.find(p => p.nombre === texto);
}
import { productos } from "./datos.js";
import { filtrarPorPrecio, buscarPorNombre } from "./filtros.js";
console.log(filtrarPorPrecio(productos, 50000));
console.log(buscarPorNombre(productos, "Mouse"));
Pistas o ayudas:
- Divide responsabilidades entre archivos.
- Este patrón imita la estructura de proyectos reales.
Operador ternario y nullish coalescing
Reto 1: “Edad suficiente”
Nivel: Básico
Tiempo estimado de resolución: 10 minutos
Participantes: Individual
Enunciado: Crea una función esMayorDeEdad(edad)
que devuelva:
- "Mayor de edad" si la edad es 18 o más -"Menor de edad" en caso contrario.
Usa el operador ternario.
Resultado esperado:
esMayorDeEdad(20); // "Mayor de edad"
esMayorDeEdad(15); // "Menor de edad"
Pistas o ayudas:
- La sintaxis básica es:
condición ? valor_si_true : valor_si_false
.
Reto 2: “Mostrar nombre de usuario”
Nivel: Básico
Tiempo estimado de resolución: 10 minutos
Participantes: Individual
Enunciado: Dado el valor username que puede ser null
, undefined
o un string válido, usa el operador nullish coalescing (??
) para imprimir:
Bienvenido, [nombre]
Si no hay nombre, imprime:
Bienvenido, Invitado
Resultado esperado:
const username = null;
console.log(`Bienvenido, ${username ?? "Invitado"}`);
Pistas o ayudas:
- A diferencia del
||
, el??
solo actúa antenull
oundefined
, no ante""
o0
.
Reto 3: “¿Con descuento?”
Nivel: Medio
Tiempo estimado de resolución: 15 minutos
Participantes: En parejas
Enunciado: Crea una función calcularPrecio(precio, tieneDescuento)
que retorne:
- Si
tieneDescuento
es true, el precio con 10% de descuento - Si es false, el precio original
Usa el operador ternario para resolverlo.
Resultado esperado:
calcularPrecio(100000, true); // 90000
calcularPrecio(100000, false); // 100000
Pistas o ayudas:
- Dentro del ternario puedes hacer operaciones matemáticas.
- Evita usar
if
; resuelve todo en una línea.
Reto 4: “Control de parámetros”
Nivel: Medio
Tiempo estimado de resolución: 20 minutos
Participantes: Individual
Enunciado: Crea una función saludar(nombre)
que imprima:
¡Hola, [nombre]!
Si nombre es null
o undefined
, usa el operador ??
para reemplazar por "invitado".
Resultado esperado:
saludar("Mario"); // ¡Hola, Mario!
saludar(undefined); // ¡Hola, invitado!
Pistas o ayudas:
- No uses
if
; usa template literals y el operador??
.
Reto 5: “Sistema de acceso”
Nivel: Avanzado
Tiempo estimado de resolución: 30 minutos
Participantes: En grupo
Enunciado: Crea una función verificarAcceso(usuario)
que reciba un objeto como:
const usuario = {
nombre: "Andrea",
rol: "admin",
activo: true
};
La función debe:
- Imprimir
"Acceso permitido a [nombre]"
si activo es true - Imprimir
"Acceso denegado"
en caso contrario - Si nombre está ausente (
null
oundefined
), usar"usuario anónimo"
Usa operador ternario y ??
.
Resultado esperado:
verificarAcceso({ nombre: null, rol: "admin", activo: true });
// Acceso permitido a usuario anónimo
verificarAcceso({ nombre: "Laura", activo: false });
// Acceso denegado
Pistas o ayudas:
- Usa destructuring para simplificar.
- Aplica ternario para la condición y
??
para el nombre.
Reto General
Modalidad: En parejas o grupos de 3
Duración total estimada: 90 minutos
Nivel: Progresivo (de básico a avanzado)
Objetivo del reto
Deberán resolver una serie de desafíos interconectados, usando:
- let, const, var
- Arrow functions y el contexto de this
- Destructuring (arrays y objetos)
- Spread y Rest
- Template literals
- Clases y herencia
- Módulos (import/export)
- Operador ternario y nullish coalescing
Cada desafío desbloquea el siguiente, simulando una misión de infiltración digital.
Desafíos del reto
Misión 1: Configuración inicial
Nivel: Básico
Tiempo estimado: 10 minutos
Enunciado: Declara 3 constantes para almacenar tu nombre, tu rol y tu nivel de acceso. Luego imprime:
"Acceso solicitado por [nombre] como [rol], *nivel:* [nivel]"
Conceptos clave: let
, const
, template literals
Resultado esperado:
const nombre = "Laura";
const rol = "analista";
const nivel = 3;
console.log(`Acceso solicitado por ${nombre} como ${rol}, *nivel:* ${nivel}`);
Pista: Usa const
si los valores no cambian y backticks para imprimir.
Misión 2: Infiltración de datos
Nivel: Medio
Tiempo estimado: 15 minutos
Enunciado: Tienes el siguiente objeto:
const agente = {
nombre: "Zeta",
habilidades: ["sigilo", "hackeo", "combate"],
equipo: {
gadget: "infiltrador",
acceso: null
}
};
- Usa destructuring para extraer nombre, gadget y la primera habilidad.
- Usa el operador
??
para reemplazar acceso con "limitado" si esnull
.
Imprime:
El agente Zeta usa el infiltrador y su acceso es limitado.
Conceptos clave: Destructuring, nullish coalescing, template literals
Misión 3: Herramientas extendidas
Nivel: Medio
Tiempo estimado: 15 minutos
Enunciado: Tienes una lista de códigos base:
const codigosBase = ["X1", "Y3", "Z5"];
const nuevosCodigos = ["A9", ...codigosBase, "B2"];
Crea una función reporteCodigos(...codigos)
que reciba códigos con rest operator.
Usa una arrow function para recorrer e imprimir:
Código detectado: X1
Código detectado: Y3
…
Conceptos clave: Spread, Rest, Arrow function
Misión 4: Guardianes del sistema
Nivel: Avanzado
Tiempo estimado: 20 minutos
Enunciado: Crea una clase Usuario
con propiedades nombre y nivel. Luego, crea una subclase Administrador
que además tenga un arreglo de permisos. Agrega un método resumen()
que imprima:
Admin Laura con nivel 5 tiene permisos: crear, editar, eliminar
Conceptos clave: Clases, herencia, template literals
Pista: Usa super()
para heredar del constructor de la clase base.
Misión 5: Centro de control modular
Nivel: Avanzado
Tiempo estimado: 25 minutos
Enunciado: Divide tu programa en 3 módulos:
Usuarios:
export class Usuario { ... }
export class Administrador extends Usuario { ... }
Herramientas:
export function reporteCodigos(...codigos) { ... }
export const codigosBase = [ ... ];
main.js: Importa todo y crea un flujo que:
- Instancie un Administrador
- Genere un reporte de códigos
- Use un operador ternario para verificar si tiene permisos
Conceptos clave: Módulos, ternario, nullish, arrow functions, clases, destructuring