La estructura switch en JavaScript te permite elegir entre múltiples casos definidos, como si seleccionaras un plato de un menú. Es ideal cuando necesitas evaluar una sola expresión contra varios valores específicos y ejecutar bloques de código distintos según coincida cada uno.
A diferencia de if else, que evalúa condiciones abiertas y dinámicas, switch trabaja mejor cuando tienes un conjunto cerrado de opciones. Piensa en los días de la semana, los niveles de un usuario o las categorías de un producto.
¿Cuál es la anatomía de un switch en JavaScript?
Antes de escribir tu primer bloque, conviene entender cada pieza que lo compone porque cada palabra reservada cumple una función puntual.
La estructura básica usa estas piezas:
switch: palabra reservada que inicializa el bloque y recibe la expresión a evaluar.
case: define cada valor posible de la expresión, seguido de dos puntos (no punto y coma).
break: corta la ejecución para que el flujo no caiga al siguiente case.
default: bloque que se ejecuta cuando ningún case coincide con la expresión.
¿Por qué se usa break en switch? Porque sin break, JavaScript sigue ejecutando los case siguientes aunque ya haya encontrado una coincidencia. El break detiene el flujo y sale del bloque.
¿Cómo se escribe un switch para los días de la semana?
El ejemplo clásico para entender switch es clasificar días laborales y fines de semana. Comienza creando una constante con el día y luego pásala como expresión al switch.
javascript
const dia = "lunes";
switch (dia) {
case "lunes":
case "martes":
case "miércoles":
case "jueves":
case "viernes":
console.log("Día laboral");
break;
case "sábado":
case "domingo":
console.log("Fin de semana");
break;
default:
console.log("Día no válido");
}
Fíjate en algo interesante: los case de lunes a jueves no tienen código propio, así que el flujo cae hasta el console.log de viernes. Este comportamiento se llama fallthrough y es útil cuando varios valores comparten la misma respuesta.
Si cambias dia a "martes" y ejecutas el bloque, la salida sigue siendo "Día laboral" porque todos los días laborales se agrupan en el mismo bloque de ejecución.
¿Cómo darle un mensaje único a cada case?
Si quieres que cada día imprima algo distinto, agrega su propio console.log y su break dentro del case.
javascript
case "lunes":
console.log("Hoy es lunes");
break;
Así, al llamar a "lunes", entrarás directamente en esa condición y verás el mensaje específico antes de salir del bloque.
¿Cuándo usar switch y cuándo if else?
La elección entre ambas estructuras depende del tipo de decisión que necesites tomar. Cada una tiene su terreno donde brilla.
Usa if else cuando manejas condiciones abiertas, comparaciones con rangos o múltiples expresiones combinadas (por ejemplo: si llueve y hace frío).
Usa switch cuando evalúas una sola expresión contra valores específicos y conocidos, como un día, un estado o una categoría.
Evita switch si tu lista de casos crece sin control: tener 30 case para los días del mes no es lógica estructurada, es repetición innecesaria.
¿Switch puede manejar múltiples condiciones a la vez? No. Switch solo evalúa una expresión contra valores exactos. Si necesitas combinar condiciones (como rangos o múltiples variables), if else es la herramienta correcta.
La clave está en el pensamiento estructurado: antes de escribir código, pregúntate si tu problema realmente se resuelve eligiendo entre opciones cerradas o si requiere una lógica más flexible. Repetir código es la salida fácil; diseñar bien es lo que hace la diferencia.
Más adelante vas a profundizar en patrones de diseño, implementación y arquitectura que te ayudarán a tomar estas decisiones con criterio. Por ahora, practica con los retos de la sección de recursos y comparte tus soluciones en los comentarios para que toda la comunidad aprenda contigo.
console.log(Este dia = ${dia} no existe en la semana :V)
}
En lugar de poner un console.log para cada uno solo usamos el ${} que nos indica de una vez que dia es :)
Comparto mi código de los ejercicios
// ============================================// Reto: Switch en JavaScript// ============================================// Practica la estructura switch: case, break, default y agrupación de casos// para comparar una misma expresión con varias opciones.// Ejecuta los tests con: npx vitest src/10-switch// ============================================// --- Reto 1: Día laboral o fin de semana ---// Recibe "dia" (string en minúsculas: "lunes", "martes", ..., "domingo").// Retorna "día laboral" para lunes a viernes, "fin de semana" para sábado y domingo,// "día no válido" para cualquier otro valor.// Usa switch agrupando los casos que comparten la misma acción (sin repetir código).functiontipoDeDia(dia){// Tu código aquíswitch(dia){case'lunes':case'martes':case'miércoles':case'jueves':case'viernes':return'día laboral';break;case'sábado':case'domingo':return'fin de semana';break;default:return'día no válido'}}console.log(tipoDeDia('día'));// --- Reto 2: Mensaje según opción ---// Recibe "opcion" (string: "a", "b" o "c").// Retorna "Opción A" si opcion === "a", "Opción B" si "b", "Opción C" si "c".// Si no coincide con ninguno, retorna "opción no válida" (usa default).// Usa switch con break en cada case para que no se ejecute el siguiente.functionmensajeOpcion(opcion){// Tu código aquíswitch(opcion){case'a':return'Opción A';break;case'b':return'Opción B';break;case'c':return'Opción C';break;default:return'Opción no válida';break;}}console.log(mensajeOpcion('c'));// --- Reto 3: Categoría por código ---// Recibe "codigo" (string: "E1", "E2", "H1").// Retorna "electrónica" para "E1" y "E2" (agrupa ambos case en un mismo resultado).// Retorna "hogar" para "H1".// Retorna "desconocido" para cualquier otro (default).// Practica agrupar varios case que comparten la misma acción.functioncategoriaPorCodigo(codigo){// Tu código aquíswitch(codigo){case'E1':case'E2':return'electrónica';break;case'H1':return'hogar';break;default:return'desconocido';}}console.log(categoriaPorCodigo('E2'));// --- Reto 4: Días del mes ---// Recibe "mes" (número del 1 al 12).// Retorna el número de días del mes: 31 para ene, mar, may, jul, ago, oct, dic;// 30 para abr, jun, sep, nov; 28 para feb.// Retorna 0 si el mes no es válido (default).// Usa switch agrupando los meses que tienen los mismos días.functiondiasDelMes(mes){// Tu código aquíswitch(mes){case'ene':case'mar':case'may':case'jul':case'ago':case'oct':case'dic':return31;break;case'abr':case'jun':case'sep':case'nov':return30;break;case'feb':return28;break;default:return0;}}console.log(diasDelMes('oct'));// --- Reto 5: Nivel de usuario ---// Recibe "nivel" (string: "principiante", "intermedio", "avanzado").// Retorna "acceso básico" para principiante, "acceso estándar" para intermedio,// "acceso completo" para avanzado.// Retorna "nivel no válido" para cualquier otro valor (default).functionnivelDeUsuario(nivel){// Tu código aquíswitch(nivel){case'principiante':return'acceso básico';break;case'intermedio':return'acceso estándar';break;case'avanzado':return'acceso completo';break;default:return'nivel no válido';break;}}console.log(nivelDeUsuario('intermedio'));module.exports={ tipoDeDia, mensajeOpcion, categoriaPorCodigo, diasDelMes, nivelDeUsuario,};
// ============================================// Reto: Switch en JavaScript// ============================================// Practica la estructura switch: case, break, default y agrupación de casos// para comparar una misma expresión con varias opciones.// Ejecuta los tests con: npx vitest src/10-switch// ============================================// --- Reto 1: Día laboral o fin de semana ---// Recibe "dia" (string en minúsculas: "lunes", "martes", ..., "domingo").// Retorna "día laboral" para lunes a viernes, "fin de semana" para sábado y domingo,// "día no válido" para cualquier otro valor.// Usa switch agrupando los casos que comparten la misma acción (sin repetir código).functiontipoDeDia(dia){switch(dia){case'lunes':case'martes':case'miércoles':case'jueves':case'viernes':return'día laboral';breakcase'sábado':case'domingo':return'fin de semana';breakdefault:return'día no válido';}}// --- Reto 2: Mensaje según opción ---// Recibe "opcion" (string: "a", "b" o "c").// Retorna "Opción A" si opcion === "a", "Opción B" si "b", "Opción C" si "c".// Si no coincide con ninguno, retorna "opción no válida" (usa default).// Usa switch con break en cada case para que no se ejecute el siguiente.functionmensajeOpcion(opcion){switch(opcion){case'a':return'Opción A';breakcase'b':return'Opción B';breakcase'c':return'Opción C';breakdefault:return'opción no válida';}// Tu código aquí}// --- Reto 3: Categoría por código ---// Recibe "codigo" (string: "E1", "E2", "H1").// Retorna "electrónica" para "E1" y "E2" (agrupa ambos case en un mismo resultado).// Retorna "hogar" para "H1".// Retorna "desconocido" para cualquier otro (default).// Practica agrupar varios case que comparten la misma acción.functioncategoriaPorCodigo(codigo){switch(codigo){case'E2':case'E1':return'electrónica';breakcase'H1':return'hogar';breakdefault:return"desconocido";}// Tu código aquí}// --- Reto 4: Días del mes ---// Recibe "mes" (número del 1 al 12).// Retorna el número de días del mes: 31 para ene, mar, may, jul, ago, oct, dic;// 30 para abr, jun, sep, nov; 28 para feb.// Retorna 0 si el mes no es válido (default).// Usa switch agrupando los meses que tienen los mismos días.functiondiasDelMes(mes){switch(mes){case1:case3:case5:case7:case8:case10:case12:return31;breakcase4:case6:case9:case11:return30;breakcase2:return28;breakdefault:return0}// Tu código aquí}// --- Reto 5: Nivel de usuario ---// Recibe "nivel" (string: "principiante", "intermedio", "avanzado").// Retorna "acceso básico" para principiante, "acceso estándar" para intermedio,// "acceso completo" para avanzado.// Retorna "nivel no válido" para cualquier otro valor (default).functionnivelDeUsuario(nivel){switch(nivel){case'principiante':return'acceso básico';breakcase'intermedio':return'acceso estándar';breakcase'avanzado':return'acceso completo';breakdefault:return'nivel no válido';}// Tu código aquí}module.exports={ tipoDeDia, mensajeOpcion, categoriaPorCodigo, diasDelMes, nivelDeUsuario,};
// ============================================
// Reto: Switch en JavaScript
// ============================================
// Practica la estructura switch: case, break, default y agrupación de casos
// para comparar una misma expresión con varias opciones.
// Ejecuta los tests con: npx vitest src/10-switch
// ============================================
// --- Reto 1: Día laboral o fin de semana ---
// Recibe "dia" (string en minúsculas: "lunes", "martes", ..., "domingo").
// Retorna "día laboral" para lunes a viernes, "fin de semana" para sábado y domingo,
// "día no válido" para cualquier otro valor.
// Usa switch agrupando los casos que comparten la misma acción (sin repetir código).
function tipoDeDia(dia) {
switch (dia) {
case 'lunes':
case 'martes':
case 'miércoles':
case 'jueves':
case 'viernes':
return 'día laboral';
break
case 'sábado':
case 'domingo':
return 'fin de semana';
break
default:
return 'día no válido';
}
}
// --- Reto 2: Mensaje según opción ---
// Recibe "opcion" (string: "a", "b" o "c").
// Retorna "Opción A" si opcion === "a", "Opción B" si "b", "Opción C" si "c".
// Si no coincide con ninguno, retorna "opción no válida" (usa default).
// Usa switch con break en cada case para que no se ejecute el siguiente.
function mensajeOpcion(opcion) {
switch (opcion) {
case 'a':
return 'Opción A';
break
case 'b':
return 'Opción B';
break
case 'c':
return 'Opción C';
break
default:
return 'opción no válida';
} // Tu código aquí
}
// --- Reto 3: Categoría por código ---
// Recibe "codigo" (string: "E1", "E2", "H1").
// Retorna "electrónica" para "E1" y "E2" (agrupa ambos case en un mismo resultado).
// Retorna "hogar" para "H1".
// Retorna "desconocido" para cualquier otro (default).
// Practica agrupar varios case que comparten la misma acción.
function categoriaPorCodigo(codigo) {
switch (codigo) {
case 'E2':
case 'E1':
return 'electrónica';
break
case 'H1':
return 'hogar';
break
default:
return "desconocido";
} // Tu código aquí
}
// --- Reto 4: Días del mes ---
// Recibe "mes" (número del 1 al 12).
// Retorna el número de días del mes: 31 para ene, mar, may, jul, ago, oct, dic;
// 30 para abr, jun, sep, nov; 28 para feb.
// Retorna 0 si el mes no es válido (default).
// Usa switch agrupando los meses que tienen los mismos días.
// Retorna "acceso básico" para principiante, "acceso estándar" para intermedio,
// "acceso completo" para avanzado.
// Retorna "nivel no válido" para cualquier otro valor (default).
function nivelDeUsuario(nivel) {
switch (nivel) {
case 'principiante':
return 'acceso básico';
break
case 'intermedio':
return 'acceso estándar';
break
case 'avanzado':
return 'acceso completo';
break
default:
return 'nivel no válido';
} // Tu código aquí
}
module.exports = {
tipoDeDia,
mensajeOpcion,
categoriaPorCodigo,
diasDelMes,
nivelDeUsuario,
};
const dia = new Date().getDay();
switch (dia) {
case 1:
console.log("Es lunes");
break;
case 2:
console.log("Es martes");
break;
case 3:
console.log("Es miercoles");
break;
case 4:
console.log("Es jueves");
break;
case 5:
console.log("Es viernes");
break;
case 6:
console.log("Es sabado");
break;
case 0:
console.log("Es domingo");
break;
default:
console.log("No es un dia valido");
break;
}
// ============================================// Reto: Switch en JavaScript// ============================================// Practica la estructura switch: case, break, default y agrupación de casos// para comparar una misma expresión con varias opciones.// Ejecuta los tests con: npx vitest src/10-switch// ============================================// --- Reto 1: Día laboral o fin de semana ---// Recibe "dia" (string en minúsculas: "lunes", "martes", ..., "domingo").// Retorna "día laboral" para lunes a viernes, "fin de semana" para sábado y domingo,// "día no válido" para cualquier otro valor.// Usa switch agrupando los casos que comparten la misma acción (sin repetir código).functiontipoDeDia(dia){switch(dia){case'lunes':case'martes':case'miercoles':case'jueves':case'viernes':console.log('Dia laboral');break;case'sabado':case'domingo':console.log('Fin de semana.');break;default:console.log('No es un dia valido');}}// --- Reto 2: Mensaje según opción ---// Recibe "opcion" (string: "a", "b" o "c").// Retorna "Opción A" si opcion === "a", "Opción B" si "b", "Opción C" si "c".// Si no coincide con ninguno, retorna "opción no válida" (usa default).// Usa switch con break en cada case para que no se ejecute el siguiente.functionmensajeOpcion(opcion){switch(opcion){case'a':console.log('Opcion 'A'');break;case'b':console.log('Opcion 'B'');break;case'c':console.log('Opcion 'C'');break;default:console.log('opcion no valida'),}}mensajeOpcion('a');mensajeOpcion('b');mensajeOpcion('c');mensajeOpcion('d');// --- Reto 3: Categoría por código ---// Recibe "codigo" (string: "E1", "E2", "H1").// Retorna "electrónica" para "E1" y "E2" (agrupa ambos case en un mismo resultado).// Retorna "hogar" para "H1".// Retorna "desconocido" para cualquier otro (default).// Practica agrupar varios case que comparten la misma acción.functioncategoriaPorCodigo(codigo){switch(codigo.toUpperCase()){case'E1':case'E2':return'electronica';break;case'H1':return'hogar';break;default:return'desconocido';break;}}console.log(categoriaPorCodigo('e1'));console.log(categoriaPorCodigo('H1'));console.log(categoriaPorCodigo('f1'));// --- Reto 4: Días del mes ---// Recibe "mes" (número del 1 al 12).// Retorna el número de días del mes: 31 para ene, mar, may, jul, ago, oct, dic;// 30 para abr, jun, sep, nov; 28 para feb.// Retorna 0 si el mes no es válido (default).// Usa switch agrupando los meses que tienen los mismos días.functiondiasDelMes(mes){switch(mes){case1:case3:case5:case7:case8:case10:case12:return'este mes tiene 31 dias';break;case4:case6:case9:case11:return'este mes tiene 30 dias';break;case2:return'este mes tiene 28 dias';break;default:return'mes inexistente';break;}}console.log(diasDelMes(2));console.log(diasDelMes(4));console.log(diasDelMes(1));console.log(diasDelMes(0));// --- Reto 5: Nivel de usuario ---// Recibe "nivel" (string: "principiante", "intermedio", "avanzado").// Retorna "acceso básico" para principiante, "acceso estándar" para intermedio,// "acceso completo" para avanzado.// Retorna "nivel no válido" para cualquier otro valor (default).functionnivelDeUsuario(nivel){switch(nivel.toUpperCase()){case'principiante':return'acceso basico';break;case'intermedio':return'acceso estandar';break;case'avanzado':return'acceso completo';break;default:return'nivel no valido';break;}}console.log(nivelDeusuario('Principiante'));console.log(nivelDeusuario('intermedio'));console.log(nivelDeusuario('AVANZADO'));console.log(nivelDeusuario('admin'));module.exports={ tipoDeDia, mensajeOpcion, categoriaPorCodigo, diasDelMes, nivelDeUsuario,};
Por si a alguien le interesa o le sirve.
// ============================================// Reto: Switch en JavaScript// ============================================// Practica la estructura switch: case, break, default y agrupación de casos// para comparar una misma expresión con varias opciones.// Ejecuta los tests con: npx vitest src/10-switch// ============================================// --- Reto 1: Día laboral o fin de semana ---// Recibe "dia" (string en minúsculas: "lunes", "martes", ..., "domingo").// Retorna "día laboral" para lunes a viernes, "fin de semana" para sábado y domingo,// "día no válido" para cualquier otro valor.// Usa switch agrupando los casos que comparten la misma acción (sin repetir código).functiontipoDeDia(dia){// Tu código aquílet mensaje ='';switch(dia){case'lunes':case'martes':case'miércoles':case'jueves':case'viernes': mensaje ='día laboral';break;case'sábado':case'domingo': mensaje ='fin de semana';break;default: mensaje ='día no válido';break;}return mensaje;}// --- Reto 2: Mensaje según opción ---// Recibe "opcion" (string: "a", "b" o "c").// Retorna "Opción A" si opcion === "a", "Opción B" si "b", "Opción C" si "c".// Si no coincide con ninguno, retorna "opción no válida" (usa default).// Usa switch con break en cada case para que no se ejecute el siguiente.functionmensajeOpcion(opcion){// Tu código aquílet mensaje ='';switch(opcion){case'a': mensaje ='Opción A'break;case'b': mensaje ='Opción B';break;case'c': mensaje ='Opción C';break;default: mensaje ='opción no válida';break;}return mensaje;}// --- Reto 3: Categoría por código ---// Recibe "codigo" (string: "E1", "E2", "H1").// Retorna "electrónica" para "E1" y "E2" (agrupa ambos case en un mismo resultado).// Retorna "hogar" para "H1".// Retorna "desconocido" para cualquier otro (default).// Practica agrupar varios case que comparten la misma acción.functioncategoriaPorCodigo(codigo){// Tu código aquílet mensaje ='';switch(codigo){case'E1':case'E2': mensaje ='electrónica';break;case'H1': mensaje ='hogar'break;default: mensaje ='desconocido';break;}return mensaje;}// --- Reto 4: Días del mes ---// Recibe "mes" (número del 1 al 12).// Retorna el número de días del mes: 31 para ene, mar, may, jul, ago, oct, dic;// 30 para abr, jun, sep, nov; 28 para feb.// Retorna 0 si el mes no es válido (default).// Usa switch agrupando los meses que tienen los mismos días.functiondiasDelMes(mes){// Tu código aquílet numeroDias;switch(mes){case1:case3:case5:case7:case8:case10:case12: numeroDias =31;break;case2: numeroDias =28;break;case4:case6:case9:case11: numeroDias =30;break;default: numeroDias =0;break;}return numeroDias;}// --- Reto 5: Nivel de usuario ---// Recibe "nivel" (string: "principiante", "intermedio", "avanzado").// Retorna "acceso básico" para principiante, "acceso estándar" para intermedio,// "acceso completo" para avanzado.// Retorna "nivel no válido" para cualquier otro valor (default).functionnivelDeUsuario(nivel){// Tu código aquílet mensaje ='';switch(nivel){case'principiante': mensaje ='acceso básico';break;case'intermedio': mensaje ='acceso estándar';break;case'avanzado': mensaje ='acceso completo';break;default: mensaje ='nivel no válido';break;}return mensaje;}module.exports={ tipoDeDia, mensajeOpcion, categoriaPorCodigo, diasDelMes, nivelDeUsuario,};