Menu

Switch en JavaScript: case, break y fallthrough

Cómo funciona la sentencia switch en JavaScript: case, break, default, fallthrough y cuándo conviene usar switch en lugar de un if/else encadenado.

La sentencia switch en JavaScript: elegir una rama entre muchas

El switch es una estructura de control pensada para cuando necesitas comparar un mismo valor contra varias opciones conocidas. Una cadena de if/else if/else hace exactamente lo mismo, pero cuando llevas tres o cuatro comprobaciones seguidas sobre la misma variable, switch se lee mucho mejor.

Esta es su forma básica:

index.js
Output
Click Run to see the output here.

Si lo lees de arriba a abajo: JavaScript evalúa day, lo compara con cada etiqueta case y ejecuta el bloque que coincida. El default atrapa cualquier cosa que no haya coincidido, igual que un else al final. El orden de lectura es valorcasecódigo.

Cómo funciona realmente la comparación en switch

switch compara con igualdad estricta, es decir, con el operador ===. Sin conversión de tipos, sin coincidencias aproximadas. case 1: coincidirá con el número 1, pero no con la cadena "1".

index.js
Output
Click Run to see the output here.

Solo coincide el segundo caso. Si alguna vez te sorprende que tu switch no se dispare, lo más habitual es un desajuste entre string y número que viene de un input de formulario o de un parámetro de la URL.

break es lo que corta el flujo

Aquí es donde mucha gente tropieza. Una etiqueta case es un punto de salto, no un bloque aislado. En cuanto la ejecución cae en un caso que coincide, sigue corriendo línea por línea — atravesando incluso la etiqueta del siguiente case — hasta toparse con break, return, o el final del switch.

Mira lo que pasa sin break:

index.js
Output
Click Run to see the output here.

El valor coincide con "editor", pero aun así obtienes puede editar, puede ver y con sesión iniciada. Eso es el fallthrough: la ejecución siguió cayendo en cada case posterior porque nada le indicó que se detuviera.

Añade break y todo vuelve a su sitio:

index.js
Output
Click Run to see the output here.

Costumbre: cada case termina con break, salvo que quieras fallthrough a propósito.

Fallthrough intencional para agrupar casos

El fallthrough no siempre es un error. Omitir el break es una forma limpia de decir "estos casos hacen exactamente lo mismo":

index.js
Output
Click Run to see the output here.

Las etiquetas case vacías apiladas comparten el bloque que tienen debajo. Fíjate en que no hace falta break después de un return: la función sale por completo. Un return dentro de un switch se salta todo lo que habría venido a continuación.

Cuando sí quieras aprovechar el fallthrough entre casos con código, deja un comentario para que quien lea el código después no lo "arregle" sin querer:

index.js
Output
Click Run to see the output here.

default no tiene por qué ir al final

Por convención, default se escribe al final, que es donde la mayoría de la gente espera encontrarlo al leer el código. Pero, técnicamente, es una etiqueta más: se activa cuando ningún case coincidió, esté donde esté. Si lo colocas en medio sin break, caerá (fallthrough) en lo que venga después. Mejor déjalo al final, ciérralo con break (o no, total ya no hay nada debajo) y tu yo del futuro te lo agradecerá.

index.js
Output
Click Run to see the output here.

Cómo limitar el alcance de variables dentro de un case

Todos los case comparten el mismo ámbito de bloque: el del switch completo. Por eso, si declaras un let o const con el mismo nombre en dos casos distintos, salta un error de redeclaración:

switch (x) {
    case 1:
        let msg = "one";
        break;
    case 2:
        let msg = "two";   // SyntaxError: Identifier 'msg' has already been declared
        break;
}

La solución es usar un bloque por cada caso: envuelve el cuerpo entre { }:

index.js
Output
Click Run to see the output here.

Ahora cada msg vive en su propio ámbito y la colisión desaparece. Conviene tenerlo presente siempre que un case necesite más de una o dos líneas de lógica.

switch vs if/else en JavaScript

switch brilla cuando comparas un solo valor contra muchas opciones fijas: códigos HTTP, tipos de acciones de Redux, nombres de comandos, cadenas que funcionan como enums. El valor aparece una vez arriba del todo y la vista del lector puede recorrer las etiquetas de los case como si fueran un índice.

if/else resulta mejor cuando:

  • Comparas rangos (score >= 90, score >= 75).
  • Las condiciones mezclan variables distintas o expresiones booleanas.
  • Necesitas igualdad débil o comparaciones personalizadas (switch siempre usa ===).
index.js
Output
Click Run to see the output here.

Una alternativa moderna y muy extendida para el primer patrón es usar un objeto como tabla de búsqueda:

index.js
Output
Click Run to see the output here.

Tres líneas en lugar de un switch de nueve. Cuando los casos son simples mapeos de datos sin lógica de verdad, un objeto (o un Map) suele leerse mejor. Deja el switch para cuando cada caso tenga que hacer algo real.

Siguiente paso: bucles for

El switch resuelve una decisión frente a muchas opciones. La siguiente pieza del control de flujo es la repetición: ejecutar el mismo bloque de código una y otra vez. Para eso están los bucles for, que vemos a continuación.

Preguntas frecuentes

¿Cómo funciona un switch en JavaScript?

switch compara un valor contra una lista de etiquetas case usando igualdad estricta (===). Cuando encuentra una coincidencia, ejecuta el código de ese caso y sigue ejecutando hasta que llegue a un break o al final del bloque. La cláusula default, que es opcional, se ejecuta si ningún case coincide.

¿Qué es el fallthrough en un switch de JavaScript?

Si un case no termina con break (ni con return), la ejecución continúa cayendo en el código del siguiente case, aunque su etiqueta no coincida. A veces resulta útil para agrupar casos que comparten lógica, pero en la mayoría de ocasiones es un bug. Cierra siempre tus case con break, salvo que quieras fallthrough a propósito.

¿Cuándo conviene usar switch en lugar de if/else en JavaScript?

Usa switch cuando estés comparando un único valor contra muchas opciones fijas: códigos HTTP, action types de Redux, comandos en forma de string, etc. Quédate con if/else si necesitas rangos, varias variables o expresiones booleanas. Recuerda que switch compara con igualdad estricta, así que case '1' no casa con el número 1.

Aprende a programar con Coddy

COMENZAR