JavaScript
switch
Explica cómo seleccionar casos exactos con switch, controlar fall-through con break y decidir cuándo conviene usar if, mapas o bloques por caso.
- Última actualización
- Actualizada
- Nivel
- Fundamentos
- Fundamentos de programación
JavaScript
Explica cómo seleccionar casos exactos con switch, controlar fall-through con break y decidir cuándo conviene usar if, mapas o bloques por caso.
switch permite escoger un camino comparando una expresión con varios valores posibles.
switch (status) {
case "pending":
showPendingMessage();
break;
case "completed":
showSuccessMessage();
break;
default:
showUnknownMessage();
}JavaScript evalúa una vez la expresión escrita después de switch.
switch (status) {Después compara el resultado con cada case, desde arriba hacia abajo.
case "pending":La comparación se comporta como igualdad estricta:
1 === "1"; // falsePor eso:
const value = 1;
switch (value) {
case "1":
console.log("String");
break;
case 1:
console.log("Number");
break;
}Se ejecuta el segundo caso.
Cuando un caso coincide, JavaScript empieza a ejecutar desde ese punto.
switch (role) {
case "admin":
console.log("Admin");
case "editor":
console.log("Editor");
}Si role es "admin", se imprimen ambos mensajes porque no existe un break que detenga la ejecución.
switch (role) {
case "admin":
console.log("Admin");
break;
case "editor":
console.log("Editor");
break;
}Ahora solo se ejecuta el caso correspondiente.
La continuación hacia el siguiente caso se llama fall-through.
Puede ser un error accidental, pero también puede utilizarse de forma intencional para agrupar valores.
switch (day) {
case "saturday":
case "sunday":
console.log("Weekend");
break;
default:
console.log("Workday");
}Los dos primeros casos comparten el mismo bloque.
Cuando el fall-through es intencional y no resulta evidente, conviene dejarlo claro mediante la estructura o un comentario breve.
default se ejecuta cuando ningún caso coincide.
switch (paymentMethod) {
case "cash":
processCashPayment();
break;
case "card":
processCardPayment();
break;
default:
throw new Error("Unsupported payment method");
}No es obligatorio, pero suele ser útil para:
Los casos se revisan de arriba hacia abajo.
switch (status) {
case "pending":
// Se ejecuta si coincide.
break;
case "completed":
// Solo se revisa si el anterior no coincidió.
break;
}A diferencia de una cadena de condiciones complejas, los casos normales comparan el mismo valor con alternativas exactas.
Todos los case pertenecen al mismo bloque del switch.
Esto puede causar un error si declaras la misma variable en varios casos:
switch (status) {
case "pending":
const message = "Waiting";
break;
case "completed":
const message = "Done"; // Error de redeclaración.
break;
}Una solución es crear un bloque para cada caso:
switch (status) {
case "pending": {
const message = "Waiting";
console.log(message);
break;
}
case "completed": {
const message = "Done";
console.log(message);
break;
}
}Así cada variable vive en su propio scope.
switch suele ser una buena opción cuando:
else if.function getOrderLabel(status) {
switch (status) {
case "pending":
return "Pendiente";
case "preparing":
return "En preparación";
case "ready":
return "Lista";
case "delivered":
return "Entregada";
default:
return "Estado desconocido";
}
}Como cada caso retorna, no hace falta break.
Para rangos o condiciones diferentes, if suele expresar mejor la intención.
if (score >= 90) {
return "Excellent";
}
if (score >= 70) {
return "Approved";
}
return "Failed";Intentar convertir rangos en un switch puede producir construcciones menos directas.
switch (true) {
case score >= 90:
return "Excellent";
case score >= 70:
return "Approved";
default:
return "Failed";
}switch (true) funciona porque cada case produce un booleano, pero normalmente un if comunica mejor que se están evaluando condiciones, no valores exactos.
Cuando solo necesitas convertir una clave en un valor, un objeto puede ser más simple.
const labels = {
pending: "Pendiente",
preparing: "En preparación",
ready: "Lista",
delivered: "Entregada",
};
const label = labels[status] ?? "Estado desconocido";Usa switch cuando cada caso necesite ejecutar lógica. Usa un mapa cuando solo necesites consultar datos.
function executeOrderAction(action, order) {
switch (action) {
case "confirm": {
if (order.status !== "pending") {
throw new Error("Only pending orders can be confirmed");
}
return confirmOrder(order);
}
case "cancel": {
if (order.status === "delivered") {
throw new Error("A delivered order cannot be cancelled");
}
return cancelOrder(order);
}
case "dispatch": {
if (order.status !== "ready") {
throw new Error("Only ready orders can be dispatched");
}
return dispatchOrder(order);
}
default:
throw new Error(`Unknown action: ${action}`);
}
}El switch selecciona la acción exacta. Los if internos validan las reglas particulares de cada camino.
break cuando no se desea fall-through.switch para rangos que se entienden mejor con if.let o const en casos sin bloques propios.default cuando los datos inesperados deben detectarse.switch para una simple tabla de equivalencias.switch evalúa una expresión y la compara con cada case.===.break, return o throw detienen la ejecución del caso.if suele ser mejor para rangos y condiciones distintas.¿Qué imprime este código?
const role = "admin";
switch (role) {
case "admin":
console.log("Manage users");
case "editor":
console.log("Edit content");
break;
default:
console.log("Read content");
}Manage users
Edit contentEl primer caso no tiene break, así que la ejecución continúa en el siguiente.
Bucles explica las estructuras que repiten instrucciones mientras exista una condición o una colección por recorrer.