Setencias de Decisión en JavaScript (switch)

Author
By Darío Rivera
Posted on 2020-09-10 in Javascript

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 bloque de código basados en una condición. En el caso específico de la sentencia switch, esta condiciones están dada por un conjunto de valores o expresiones.

Condiciones mutuamente excluyentes

Al igual que las sentecias if-thenif-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 como en Java, 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-thenif-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-thenif-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);

Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.