Setencias de Decisión en JavaScript (switch)
En un post anterior hemos visto las Sentencias de Decisión en JavaScript (if-then, if-then-else), el día de hoy terminaremos el tema con la sentencia Switch. Las sentencias de control permiten ejecutar bloques de código basados en una condición. En el caso específico de la sentencia switch, estas condiciones están dadas por un conjunto de valores o expresiones.
Condiciones mutuamente excluyentes
Al igual que las sentecias if-then
, if-then-else
podemos construir una serie de condiciones las cuáles permitirán que solamente un bloque de código se ejecute. Veamos el siguiente ejemplo.
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Monday";
break;
case 2:
dayName = "Tuesday";
break;
case 3:
dayName = "Wednesday";
break;
case 4:
dayName = "Thursday";
break;
case 5:
dayName = "Friday";
break;
case 6:
dayName = "Satudary";
break;
case 7:
dayName = "Sunday";
break;
default:
dayName = "Invalid day";
}
console.log(dayName);
Al ejecutar este código se obtiene el siguiente resultado.
Wednesday
En este caso y como es de esperarse, el bloque switch verificará solamente las tres primeras condiciones ya que como day es igual a 3 entonces se cumple case 3 y ese bloque específico es ejecutado. Con la instrucción break
se impide que los bloques subsecuentes se ejecuten. Nota también que hemos agregado un bloque default
. Aunque este bloque no es obligatorio, es una buena práctica considerar un caso por defecto siempre que sea posible. Este bloque se ejecutará siempre que no se cumpla ninguna condición.
Condiciones no excluyentes
A diferencia de las sentencias if-then
, if-then-else
, la sentencia switch
permite que el flujo de ejecución pueda seguir por varios caminos y no solamente por uno. Veamos el siguiente ejemplo.
let years = 4;
let bonus = 0;
switch (years) {
case 5:
bonus += 1000;
case 4:
bonus += 0;
case 3:
bonus += 500;
case 2:
bonus += 0;
case 1:
bonus += 100;
}
console.log("Accumulated Bonus: " + bonus);
Al ejecutar este código se obtiene el siguiente resultado.
Accumulated Bonus: 600
El objetivo de este programa es calcular el bono acumulado que tendría una persona que trabaja en una empresa en la cuál al primera año recibe 100 dólares, al tercer año recibe 500 y al quinto año recibe 1000. Como puedes notar una persona que lleva cuatro años habrá obtenido un bono acumulado de 600 dólares tal y como lo muestra la salida del programa. Esto es así, dado que como habrás notado la condición entra en el statement case 4 el cuál suma a la variable bonus 0 USD. Dado que este bloque no tiene break el programa seguirá ejectando los demás bloques sin importar el valor de la expresión de las etiquetas case
. Es decir, habrá sumado después a la variable bonus 0 + 500 + 0 + 100. Ten en cuenta que el bloque switch terminará su ejecución en la primera sentencia break
que encuentre.
Múltiples etiquetas case
Una de las grandes ventajas de la etiqueta case es que se pueden agrupar condiciones con el mismo comportamiento. Supongamos ahora que el gobierno dará un incentivo a las madres por sus hijos menores de 6 años. Por un hiijo de 1 o 2 años dará un incentivo de 100 USD, por un niño de 3 años dará 500, por un niño de 4 dará 1000 y por uno de 5 dará 2000. Dado esto podemos escribir el siguiente programa.
let age = 1;
let bonus = 0;
switch (age) {
case 1:
case 2:
bonus = 100;
break;
case 3:
bonus = 500;
break;
case 4:
bonus = 1000;
break;
case 5:
bonus = 2000;
break;
}
console.log("Incentive: " + bonus);
Observa que el cambio es tan sutil como elegante. Dado que el primer y segundo año se recibe lo mismo por hijo no hace falta colocar la misma condición en el bloque case 2. La salida del programa será la siguiente tomando la variable age como la edad del menor.
Incentive: 100
Expresiones de evaluación
Con javascript podemos ir un poco más lejos todavía y evaluar expresiones complejas. Veamos que el código anterior es totalmente equivalente al siguiente:
let age = 1;
let bonus = 0;
switch (true) {
case age == 1 || age == 2:
bonus = 100;
break;
case age == 3:
bonus = 500;
break;
case age == 4:
bonus = 1000;
break;
case age == 5:
bonus = 2000;
break;
}
console.log("Incentive: " + bonus);
Para entender esto, hay que entender primero cómo trabaja el bloque switch debajo del capó. Resulta que esta sentencia de decisión comprueba el valor pasado como parámetro contra cada uno de los valores case de manera estricta ( ===
). Para los casos vistos anteriormente la cuestión era muy sencilla, el bloque realiza comparaciones del tipo 1 === 1. Sin embargo en el caso de que se pase un true como parámetro en el bloque switch la comprobación será así true === (age == 1 || age == 2). Esto nos lleva a obtener un equivalente contra la sentencia de desición if-then
, if-then-else
. Veamos su equivalente.
let age = 1;
let bonus = 0;
if (age == 1 || age == 2) {
bonus = 100;
} else if (age == 3) {
bonus = 500;
} else if (age == 4) {
bonus = 1000;
} else if (age == 5) {
bonus = 2000;
}
console.log("Incentive: " + bonus);