El operador ? es equivalente a la estructura if-else, tiene la misma lógica que dicha estructura, pero, al ser un operador, se emplea en sentencias de asignación y al interior de expresiones, su sintaxis es:
condición? instrucción caso verdadero:instrucción caso falso;
A diferencia de la estructura if-else, el caso contrario (el caso sino) es obligatorio (no opcional), porque al ser un operador, se requiere su resultado para completar las operaciones de las cuales forma parte.
Los casos de este operador pueden tener más de una instrucción, pero, de ser así, esas instrucciones deben estar encerradas entre paréntesis y separadas con comas (no entre llaves y separadas con puntos y comas):
Si bien el operador ?, puede ser empleado en los mismos casos que la estructura if, se emplea, sobre todo, en los casos donde la lógica es sencilla, porque en casos más complicados, el código se torna difícil de comprender.
Por ejemplo, el algoritmo elaborado en el capítulo anterior, que determina si un número es cero, par o impar:
Puede ser implementado con el operador ? en lugar de la estructura if:
function parImparCero(n) { if (!Number.isInteger(n)) throw "El número debe ser entero."; return n===0 ? "cero" : n%2===0 ? "par" : "impar" };
Como se puede ver, el código es más corto que el equivalente con la estructura if, sin embargo, es menos claro. Observe además que, al ser un operador, se emplea como parte de la expresión de retorno (no de forma independiente, como ocurre con la estructura if):
Llamando a la función con algunos valores de prueba, se obtienen los resultados correctos:
parImparCero(0)
0
parImparCero(115)
1
parImparCero(244)
2
parImparCero(-115)
1
parImparCero(-110)
2
Igualmente, el algoritmo que determina si un año es o no bisiesto:
var esBisiesto = function(a) { if (a%1!==0 || a<0) throw "¡El año debe ser entero positivo!"; return (a%100==0 ? a/100 : a)%4==0; };
La expresión entre paréntesis, en la instrucción de retorno: (this%100==0 ? this/100 : this), pregunta si el número es divisible entre 100 (si tiene dos ceros) y de ser así, devuelve el resultado de dividir el año entre 100 (this/100) caso contrario devuelve el valor original del año (this), en consecuencia, la expresión entre paréntesis devuelve, siempre, el año sin los dos ceros, por lo tanto sólo queda verificar si ese resultado es divisible entre 4 (%4==0). Llamando al método con algunos valores de prueba, se obtiene:
esBisiesto(1980)
true
esBisiesto(1982)
false
esBisiesto(1996)
true
esBisiesto(2000)
true
esBisiesto(2006)
false
esBisiesto(2012)
true
esBisiesto(2020)
true
esBisiesto(-2020)
¡El año debe ser entero positivo!
esBisiesto(2020.32)
¡El año debe ser entero positivo!
De forma similar, la lógica que determina el mayor de 3 números:
gojsGraph({divi, modelo: {"class":"go.GraphLinksModel","linkFromPortIdProperty":"fromPort","linkToPortIdProperty":"toPort","nodeDataArray":[{"category":"Conditional","text":"a>=b y a>=c","key":-4,"loc":"-144 -345.00000000000006"},{"category":"Start","text":"mayor","key":-1,"loc":"-144 -454"},{"category":"Input","text":"números: a, b, c","key":-3,"loc":"-143.99999999999994 -403"},{"category":"Start","text":"fin","key":-9,"loc":"-145 -147"},{"category":"Output","text":"a","key":-7,"loc":"-15.999999999999886 -221.99999999999983"},{"category":"Output","text":"c","key":-10,"loc":"-388.9999999999999 -221.99999999999983"},{"category":"Output","text":"b","key":-11,"loc":"-144.9999999999999 -221.99999999999983"},{"category":"Conditional","text":"b>=a y b>=c","key":-8,"loc":"-271 -282.00000000000006"}],"linkDataArray":[{"from":-1,"to":-3,"fromPort":"B","toPort":"T","points":[-144,-438.7333213806152,-144,-428.7333213806152,-144,-428,-143.99999999999994,-428,-143.99999999999994,-427.2666786193848,-143.99999999999994,-417.2666786193848]},{"from":-3,"to":-4,"fromPort":"B","toPort":"T","points":[-143.99999999999994,-388.7333213806152,-143.99999999999994,-378.7333213806152,-143.99999999999994,-376.8833393096924,-144,-376.8833393096924,-144,-375.0333572387696,-144,-365.0333572387696]},{"from":-4,"to":-7,"fromPort":"R","toPort":"T","visible":true,"points":[-64.41780090332031,-345.00000000000006,-54.41780090332031,-345.00000000000006,-15.999999999999886,-345.00000000000006,-15.999999999999886,-297.30556551615393,-15.999999999999886,-249.61113103230775,-15.999999999999886,-239.61113103230775],"text":"Si"},{"from":-4,"to":-8,"fromPort":"L","toPort":"T","visible":true,"points":[-223.5821990966797,-345.00000000000006,-233.5821990966797,-345.00000000000006,-271,-345.00000000000006,-271,-328.51667861938483,-271,-312.0333572387696,-271,-302.0333572387696],"text":"No"},{"from":-8,"to":-11,"fromPort":"R","toPort":"T","visible":true,"points":[-190.65548706054688,-282.00000000000006,-180.65548706054688,-282.00000000000006,-144.9999999999999,-282.00000000000006,-144.9999999999999,-265.80556551615393,-144.9999999999999,-249.61113103230775,-144.9999999999999,-239.61113103230775],"text":"Si"},{"from":-8,"to":-10,"fromPort":"L","toPort":"T","visible":true,"points":[-351.3445129394531,-282.00000000000006,-361.3445129394531,-282.00000000000006,-388.9999999999999,-282.00000000000006,-388.9999999999999,-265.80556551615393,-388.9999999999999,-249.61113103230775,-388.9999999999999,-239.61113103230775],"text":"No"},{"from":-11,"to":-9,"fromPort":"B","toPort":"T","points":[-144.9999999999999,-209.31998565673808,-144.9999999999999,-199.31998565673808,-144.9999999999999,-185.79333213806143,-145,-185.79333213806143,-145,-172.26667861938478,-145,-162.26667861938478]},{"from":-7,"to":-9,"fromPort":"B","toPort":"R","points":[-15.999999999999886,-209.31998565673808,-15.999999999999886,-199.31998565673808,-15.999999999999886,-147,-63.72024857964403,-147,-111.44047715928818,-147,-121.44047715928818,-147]},{"from":-10,"to":-9,"fromPort":"B","toPort":"L","points":[-388.9999999999999,-209.31998565673808,-388.9999999999999,-199.31998565673808,-388.9999999999999,-147,-283.77976142035584,-147,-178.5595228407118,-147,-168.5595228407118,-147]}]}})
Implementado con el operador ?, es:
var mayor = (a, b, c) => { if (!Number.isFinite(a) || !Number.isFinite(b) || !Number.isFinite(c)) throw "Los valores a ordenar deben ser números válidos." return a>=b && a>=c ? a : b>=a && b>=c ? b : c; };
llamando a la función con algunos valores de prueba, se obtiene:
mayor(1, 2, 3)
3
mayor(1, 3, 2)
3
mayor(3, 2, 1)
3
mayor(5, 4, 5)
5
mayor(4, 7, 4)
7
mayor(8, 8, 8)
8
Finalmente, el algoritmo que resuelve la ecuación de segundo grado:
Se implementa con el operador ?, de la siguiente forma:
function cuadratica(a, b, c) {
const d = b**2-4*a*c;
let r, im;
const [r1, r2] = d<0 ?
(r = -b/(2*a), im = Math.sqrt(-d)/(2*a),
[new Complex(r,im), new Complex(r,-im)])
: d==0 ?
[-b/(2*a), -b/(2*a)]
: [(-b+Math.sqrt(d))/(2*a),
(-b-Math.sqrt(d))/(2*a)];
return [r1, r2];
}
En este caso, para que el código sea más fácil de comprender, la expresión se ha dividido y espaciado en varias líneas (recuerde que, JavaScript, ignora los espacios y saltos de línea adicionales), aún así la lógica es más difícil de comprender que su equivalente if-else. Es por ello que, en la práctica, se recomienda emplear el operador ? sólo en expresiones condicionales relativamente sencillas.
Llamando a la función con los coeficientes de las siguientes ecuaciones:
Por claridad (para evitar cruces de enlaces) los diagramas de flujo se elaborarán empleando la segunda forma (con conectores en lugar de enlaces directos).
La lógica es la siguiente: Si el valor de la variable es igual a uno de los valores con los que se compara, se ejecutan las instrucciones que corresponden a esa igualdad, si no se cumple ninguna de las igualdades y existen las instrucciones por defecto, se ejecutan esas instrucciones, caso contrario la estructura switch termina y la ejecución del programa continua con el resto de las instrucciones.
El código respectivo, en JavaScript, es:
switch (valor) { case valor_1: instrucciones 1; break; case valor_2: instrucciones 2; break: case valor_3: instrucciones 3; break; .... case valor_n: instrucciones n; break; default: instrucciones por defecto; }
Donde el comando break, termina la ejecución de la estructura y hace que el programa continúe con las instrucciones existentes después de switch. Si se omite break y se cumple la igualdad de ese caso, el programa ejecuta las instrucciones de ese caso y continúa con las instrucciones de los casos siguientes, hasta que encuentra un comando break o hasta que se ejecuta la última instrucción de esta estructura (la última de las instrucciones del caso por defecto, en caso de contar con un caso por defecto). Sin embargo, en ocasiones, el comando break se omite a propósito, para que en dos o más casos consecutivos ejecuten las mismas instrucciones.
Si las condiciones son consecutivas, pero no son condiciones de igualdad y/o no se compara con la misma variable:
Se codifica empleando la estructura if- else estándar, de acuerdo al siguiente formato:
if (condición 1) { instrucciones 1; } else if (condición 2) { instrucciones 2; } else if (condición 3) { instrucciones 3; } else if (... .... } else if (condición n) { instrucciones n; } else { instrucciones por defecto; }
Número a día
El propósito de este ejemplo, es el de convertir un número comprendido entre 1 y 7, en el día de la semana equivalente, siendo el primer día de la semana (el día 1) el "domingo".
var numADia = n => {
if (n%1!=0 || n<0)
throw "El número debe ser entero positivo";
let r = "";
switch (n) {
case 1: r = "domingo"; break;
case 2: r = "lunes"; break;
case 3: r = "martes"; break;
case 4: r = "miércoles"; break;
case 5: r = "jueves"; break;
case 6: r = "viernes"; break;
case 7: r = "sábado"; break;
default: throw "El número debe estar comprendido entre 1 y 7";
}
return r;
};
Donde, como se puede ver, se valida que el número sea entero positivo, el día correspondiente se guarda en la variable "r" y al final, después de la estructura swtich, se devuelve el valor de "r" (el día equivalente al número).
Haciendo correr el programa (llamando a la función) con algunos valores de prueba, se obtiene:
numADia(3)
"martes"
numADia(6)
"viernes"
numADia(1)
"domingo"
numADia(-3)
El número debe ser entero positivo
numADia(15)
El número debe estar comprendido entre 1 y 7
Sin embargo, de acuerdo a la lógica (de acuerdo al diagrama de flujo) una vez que se cumple uno de los casos (cualquiera) el resultado es devuelto directamente. Por lo tanto, en realidad no se requiere la variable auxiliar "r", ni el comando break, sino que se puede emplear directamente el comando return, tal como se muestra en la siguiente función:
var numADia2 = n => { if (n%1!=0 || n<0) throw "El número debe ser entero positivo"; switch (n) { case 1: return "domingo"; case 2: return "lunes"; case 3: return "martes"; case 4: return "miércoles"; case 5: return "jueves"; case 6: return "viernes"; case 7: return "sábado"; default: throw "El número debe estar comprendido entre 1 y 7"; } };
Que es una versión más corta e igualmente clara, pero donde se rompe la estructura switch (se sale de la función desde el interior de la estructura, sin que la misma termine). En la práctica, si el problema es de esta clase (donde no se realizan operaciones posteriores al ciclo) se emplearía esta forma (con return), sin embargo, en este capítulo, para adquirir la costumbre de escribir correctamente la estructura switch, los problemas de este tipo se resolverán empleando la primera forma (empleando el comando break y una variable auxiliar).
Con esta función (como se espera) se obtienen los mismos resultados:
numADia2(3)
"martes"
numADia2(6)
"viernes"
numADia2(1)
"domingo"
numADia2(-3)
El número debe ser entero positivo
numADia2(15)
El número debe estar comprendido entre 1 y 7
Días del mes
Como otro ejemplo se elabora una función que devuelve el número de días que tiene un mes (m), en un determinado año (a).
El año es relevante sólo para el mes de febrero, porque si es bisiesto, el mes tiene 29 días en lugar de 28. En los otros casos simplemente se devuelve el número de días correspondientes al mes: 31 para enero, marzo, mayo, julio, agosto, octubre y diciembre y 30 para abril, junio, septiembre o noviembre.
El diagram de flujo que resuelve el problema, es:
gojsGraph({divi, modelo: {"class":"go.GraphLinksModel","linkFromPortIdProperty":"fromPort","linkToPortIdProperty":"toPort","nodeDataArray":[{"category":"Conditional","text":"m==\"enero\"","key":-5,"loc":"-10.000000000000057 -390.9999999999999"},{"category":"Conditional","text":"m==\"marzo\"","key":-4,"loc":"-10.238646189909957 -319.25378460336304"},{"category":"Conditional","text":"m==\"mayo\"","key":-6,"loc":"-9.492430793273329 -248.99999999999974"},{"category":"Conditional","text":"m==\"julio\"","key":-7,"loc":"-9.746215396636686 -176.25378460336313"},{"category":"Start","text":"diasDelMes","key":-1,"loc":"-10 -511"},{"category":"Input","text":"nombre del mes: m\naño: a (2024)","key":-3,"loc":"-10 -454.9999999999998"},{"category":"Conditional","text":"m==\"agosto\"","key":-15,"loc":"-9.238646189909929 -103.99999999999986"},{"category":"Conditional","text":"m==\"octubre\"","key":-17,"loc":"-9.238646189909929 -34.731076983183016"},{"category":"Conditional","text":"m==\"diciembre\"","key":-19,"loc":"-8.492430793273343 36.76135381009027"},{"category":"Output","text":"31","key":-27,"loc":"267.00000000000006 36.761353810090284"},{"category":"Output","text":"Error:\nNombre de mes inválido","key":-28,"loc":"-6.999999999999986 479.00000000000045"},{"category":"Start","text":"fin","key":-29,"loc":"-7 565"},{"category":"Output","text":"30","key":-13,"loc":"267 312.76135381009055"},{"category":"Conditional","text":"m==\"noviembre\"","key":-14,"loc":"-7.492430793273272 312.7613538100904"},{"category":"Conditional","text":"m==\"septiembre\"","key":-16,"loc":"-8.238646189909943 243.26892301681693"},{"category":"Conditional","text":"m==\"junio\"","key":-18,"loc":"-8.238646189909943 175.00000000000017"},{"category":"Conditional","text":"m==\"abril\"","key":-20,"loc":"-8.746215396636686 104.74621539663693"},{"category":"Conditional","text":"m==\"febrero\"","key":-21,"loc":"-7.492430793273286 382.7613538100902"},{"category":"Conditional","text":"a es bisiesto","key":-22,"loc":"230.50756920672674 425.7613538100901"},{"category":"Output","text":"28","key":-23,"loc":"119.00000000000003 474.00000000000034"},{"category":"Output","text":"29","key":-24,"loc":"345.0000000000007 473.99999999999994"},{"category":"Connector","text":"A","key":-8,"loc":"178.59999084472656 -390.9999999999999"},{"category":"Connector","text":"A","key":-25,"loc":"178.59999084472656 -319.25378460336304"},{"category":"Connector","text":"A","key":-26,"loc":"178.59999084472656 -248.99999999999977"},{"category":"Connector","text":"A","key":-30,"loc":"178.59999084472656 -176.25378460336313"},{"category":"Connector","text":"A","key":-31,"loc":"178.59999084472656 -103.99999999999986"},{"category":"Connector","text":"A","key":-32,"loc":"178.59999084472656 -34.73107698318302"},{"category":"Connector","text":"D","key":-34,"loc":"267.0000000000001 104.74621539663696"},{"category":"Connector","text":"B","key":-35,"loc":"178.59999084472656 104.74621539663693"},{"category":"Connector","text":"B","key":-36,"loc":"178.59999084472656 175.00000000000017"},{"category":"Connector","text":"B","key":-37,"loc":"178.59999084472656 243.26892301681693"},{"category":"Connector","text":"D","key":-33,"loc":"267.00000000000006 382.7613538100903"},{"category":"Connector","text":"D","key":-38,"loc":"230.50756920672666 505.00000000000034"},{"category":"Connector","text":"A","key":-39,"loc":"178.59999084472656 36.76135381009027"},{"category":"Connector","text":"B","key":-40,"loc":"178.59999084472656 312.7613538100904"},{"category":"Connector","text":"D","key":-41,"loc":"178.59999084472656 565"}],"linkDataArray":[{"from":-5,"to":-4,"fromPort":"B","toPort":"T","visible":true,"points":[-10.000000000000057,-370.9666427612304,-10.000000000000057,-360.9666427612304,-10.000000000000057,-355.12689230168144,-10.238646189909957,-355.12689230168144,-10.238646189909957,-349.28714184213254,-10.238646189909957,-339.28714184213254],"text":"No"},{"from":-4,"to":-6,"fromPort":"B","toPort":"T","visible":true,"points":[-10.238646189909957,-299.2204273645935,-10.238646189909957,-289.2204273645935,-10.238646189909957,-284.12689230168144,-9.492430793273314,-284.12689230168144,-9.492430793273314,-279.0333572387694,-9.492430793273314,-269.0333572387694],"text":"No"},{"from":-6,"to":-7,"fromPort":"B","toPort":"T","visible":true,"points":[-9.492430793273314,-228.96664276123033,-9.492430793273314,-218.96664276123033,-9.492430793273314,-212.6268923016815,-9.746215396636686,-212.6268923016815,-9.746215396636686,-206.28714184213268,-9.746215396636686,-196.28714184213268],"text":"No"},{"from":-7,"to":-15,"fromPort":"B","toPort":"T","visible":true,"points":[-9.746215396636686,-156.2204273645936,-9.746215396636686,-146.2204273645936,-9.746215396636686,-140.1268923016815,-9.238646189909929,-140.1268923016815,-9.238646189909929,-134.0333572387694,-9.238646189909929,-124.03335723876941],"text":"No"},{"from":-15,"to":-17,"fromPort":"B","toPort":"T","visible":true,"points":[-9.238646189909929,-83.96664276123035,-9.238646189909929,-73.96664276123035,-9.238646189909929,-69.36553849159145,-9.238646189909929,-69.36553849159145,-9.238646189909929,-64.76443422195256,-9.238646189909929,-54.764434221952556],"text":"No"},{"from":-17,"to":-19,"fromPort":"B","toPort":"T","visible":true,"points":[-9.238646189909929,-14.69771974441349,-9.238646189909929,-4.69771974441349,-9.238646189909929,1.0151384134536023,-8.492430793273314,1.0151384134536023,-8.492430793273314,6.727996571320695,-8.492430793273314,16.727996571320695],"text":"No"},{"from":-3,"to":-5,"fromPort":"B","toPort":"T","points":[-10,-431.96664276123033,-10,-421.96664276123033,-10,-421.5,-10.000000000000057,-421.5,-10.000000000000057,-421.0333572387696,-10.000000000000057,-411.0333572387696]},{"from":-1,"to":-3,"fromPort":"B","toPort":"T","points":[-10.000000000000007,-495.7333213806154,-10.000000000000007,-485.7333213806154,-10.000000000000004,-485.7333213806154,-10.000000000000004,-488.0333572387693,-10,-488.0333572387693,-10,-478.0333572387693]},{"from":-19,"to":-39,"fromPort":"R","toPort":"L","visible":true,"points":[97.38977135516416,36.76135381009027,107.38977135516416,36.76135381009027,160.1934894983829,36.76135381009027,160.1934894983829,36.76135381009027,153.90423703748127,36.76135381009027,163.90423703748127,36.76135381009027],"text":"Si"},{"from":-14,"to":-40,"fromPort":"R","toPort":"L","visible":true,"points":[103.88728417254704,312.7613538100904,113.88728417254704,312.7613538100904,163.94224590707432,312.7613538100904,163.94224590707432,312.7613538100904,153.90423703748127,312.7613538100904,163.90423703748127,312.7613538100904],"text":"Si"},{"from":-16,"to":-14,"fromPort":"B","toPort":"T","visible":true,"points":[-8.238646189909943,263.3022802555864,-8.238646189909943,273.3022802555864,-8.238646189909943,278.01513841345354,-7.492430793273272,278.01513841345354,-7.492430793273272,282.7279965713206,-7.492430793273272,292.7279965713206],"text":"No"},{"from":-18,"to":-16,"fromPort":"B","toPort":"T","visible":true,"points":[-8.238646189909957,195.03335723876972,-8.238646189909957,205.03335723876972,-8.238646189909957,209.13446150840855,-8.238646189909943,209.13446150840855,-8.238646189909943,213.23556577804737,-8.238646189909943,223.23556577804737],"text":"No"},{"from":-20,"to":-18,"fromPort":"B","toPort":"T","visible":true,"points":[-8.746215396636686,124.77957263540641,-8.746215396636686,134.7795726354064,-8.746215396636686,139.8731076983185,-8.238646189909957,139.8731076983185,-8.238646189909957,144.96664276123064,-8.238646189909957,154.96664276123064],"text":"No"},{"from":-19,"to":-20,"fromPort":"B","toPort":"T","visible":true,"points":[-8.492430793273343,56.7947110488598,-8.492430793273343,66.7947110488598,-8.492430793273343,70.75378460336357,-8.746215396636686,70.75378460336357,-8.746215396636686,74.71285815786734,-8.746215396636686,84.71285815786734],"text":"No"},{"from":-14,"to":-21,"fromPort":"B","toPort":"T","visible":true,"points":[-7.492430793273272,332.79471104885965,-7.492430793273272,342.79471104885965,-7.492430793273272,347.76135381009016,-7.492430793273286,347.76135381009016,-7.492430793273286,352.72799657132066,-7.492430793273286,362.72799657132066],"text":"No"},{"from":-28,"to":-29,"fromPort":"B","toPort":"T","points":[-7,502.2000286865236,-7,512.2000286865236,-7,525.9666750335696,-7,525.9666750335696,-7,539.7333213806154,-7,549.7333213806154]},{"from":-21,"to":-28,"fromPort":"B","toPort":"T","visible":true,"points":[-7.492430793273286,402.7947110488597,-7.492430793273286,412.7947110488597,-7.492430793273286,424.78622449212196,-7,424.78622449212196,-7,436.77773793538427,-7,446.77773793538427],"text":"No"},{"from":-21,"to":-22,"fromPort":"R","toPort":"T","visible":true,"points":[83.48059166766421,382.7613538100902,93.48059166766421,382.7613538100902,230.5075692067267,382.7613538100902,230.5075692067267,395.72799657132055,230.50756920672674,395.72799657132055,230.50756920672674,405.72799657132055],"text":"Si"},{"from":-22,"to":-24,"fromPort":"R","toPort":"T","visible":true,"points":[309.86984337664865,425.7613538100901,319.86984337664865,425.7613538100901,345.00000000000006,425.7613538100901,345.00000000000006,446.38886896769196,345.0000000000003,446.38886896769196,345.0000000000003,456.38886896769196],"text":"Si"},{"from":-22,"to":-23,"fromPort":"L","toPort":"T","visible":true,"points":[151.14529503680487,425.7613538100901,141.14529503680487,425.7613538100901,119,425.7613538100901,119,446.38886896769225,119,446.38886896769225,119,456.38886896769225],"text":"No"},{"from":-5,"to":-8,"fromPort":"R","toPort":"L","visible":true,"points":[69.40629577636713,-390.9999999999999,79.40629577636713,-390.9999999999999,94.59999084472656,-390.9999999999999,94.59999084472656,-390.9999999999999,153.90423703748127,-390.9999999999999,163.90423703748127,-390.9999999999999],"text":"Si"},{"from":-4,"to":-25,"fromPort":"R","toPort":"L","visible":true,"points":[72.56877263333223,-319.25378460336304,82.56877263333223,-319.25378460336304,101.73650483540675,-319.25378460336304,101.73650483540675,-319.25378460336304,153.90423703748127,-319.25378460336304,163.90423703748127,-319.25378460336304],"text":"Si"},{"from":-6,"to":-26,"fromPort":"R","toPort":"L","visible":true,"points":[67.71485985614073,-248.99999999999974,77.71485985614073,-248.99999999999974,99.309548446811,-248.99999999999974,99.309548446811,-248.99999999999977,153.90423703748127,-248.99999999999977,163.90423703748127,-248.99999999999977],"text":"Si"},{"from":-7,"to":-30,"fromPort":"R","toPort":"L","visible":true,"points":[60.29231304574613,-176.25378460336313,70.29231304574613,-176.25378460336313,95.5982750416137,-176.25378460336313,95.5982750416137,-176.25378460336313,153.90423703748127,-176.25378460336313,163.90423703748127,-176.25378460336313],"text":"Si"},{"from":-15,"to":-31,"fromPort":"R","toPort":"L","visible":true,"points":[75.85571416165257,-103.99999999999986,85.85571416165257,-103.99999999999986,103.37997559956692,-103.99999999999986,103.37997559956692,-103.99999999999986,153.90423703748127,-103.99999999999986,163.90423703748127,-103.99999999999986],"text":"Si"},{"from":-17,"to":-32,"fromPort":"R","toPort":"L","visible":true,"points":[82.99511845852757,-34.731076983183016,92.99511845852757,-34.731076983183016,106.94967774800442,-34.731076983183016,106.94967774800442,-34.731076983183016,153.90423703748127,-34.731076983183016,163.90423703748127,-34.731076983183016],"text":"Si"},{"from":-20,"to":-35,"fromPort":"R","toPort":"L","visible":true,"points":[63.00753826547269,104.74621539663693,73.00753826547269,104.74621539663693,113.45588765147698,104.74621539663693,113.45588765147698,104.74621539663693,153.90423703748127,104.74621539663693,163.90423703748127,104.74621539663693],"text":"Si"},{"from":-18,"to":-36,"fromPort":"R","toPort":"L","visible":true,"points":[66.19789250637912,175.00000000000017,76.19789250637912,175.00000000000017,115.05106477193019,175.00000000000017,115.05106477193019,175.00000000000017,153.90423703748127,175.00000000000017,163.90423703748127,175.00000000000017],"text":"Si"},{"from":-16,"to":-37,"fromPort":"R","toPort":"L","visible":true,"points":[107.12858708645724,243.26892301681693,117.12858708645724,243.26892301681693,135.51641206196925,243.26892301681693,135.51641206196925,243.26892301681693,153.90423703748127,243.26892301681693,163.90423703748127,243.26892301681693],"text":"Si"},{"from":-39,"to":-27,"fromPort":"R","toPort":"L","points":[193.29574465197186,36.76135381009027,203.29574465197186,36.76135381009027,201.1464761467867,36.76135381009027,201.1464761467867,36.76135381009027,232.99720764160156,36.76135381009027,242.99720764160156,36.76135381009027]},{"from":-40,"to":-13,"fromPort":"R","toPort":"L","points":[193.29574465197186,312.7613538100904,203.29574465197186,312.7613538100904,210.64647614678674,312.7613538100904,210.64647614678674,312.7613538100904,232.99720764160156,312.7613538100904,242.99720764160156,312.7613538100904]},{"from":-27,"to":-34,"fromPort":"B","toPort":"T","points":[267.00000000000006,49.44136815335201,267.00000000000006,59.44136815335201,267.00000000000006,73.7534840780985,267.00000000000006,73.7534840780985,267.00000000000006,80.05046158939163,267.00000000000006,90.05046158939163]},{"from":-13,"to":-33,"fromPort":"B","toPort":"T","points":[267,325.4413681533523,267,335.4413681533523,267,346.7534840780986,267,346.7534840780986,267,358.0656000028449,267,368.0656000028449]},{"from":-23,"to":-38,"fromPort":"B","toPort":"L","points":[119,486.6800143432619,119,496.6800143432619,119,505,205.81181539948145,505,205.81181539948145,505,215.81181539948145,505]},{"from":-24,"to":-38,"fromPort":"B","toPort":"R","points":[345.0000000000003,486.68001434326163,345.0000000000003,496.68001434326163,345.0000000000003,505,255.20332301397204,505,255.20332301397204,505,245.20332301397204,505]},{"from":-41,"to":-29,"fromPort":"L","toPort":"R","points":[163.90423703748127,565,153.90423703748127,565,90.23187993909653,565,90.23187993909653,565,26.559522840711804,565,16.559522840711804,565]}]} })
El código respectivo, es:
var diasDelMes = function(m, a=2024) {
const esBisiesto = a => a%100===0 ? a%400==0 : a%4===0;
m = m.toLowerCase();
let r = 0;
switch (m) {
case "enero":
case "marzo":
case "mayo":
case "julio":
case "agosto":
case "octubre":
case "diciembre": r = 31; break;
case "abril":
case "junio":
case "septiembre":
case "noviembre": r = 30; break;
case "febrero": r = esBisiesto(a) ? 29 : 28; break;
default: throw "No ha mandado un nombre de mes válido";
}
return r;
};
Al año: a, se le asigna un valor por defecto (en el ejemplo 2024), para que, cuando el mes no sea febrero, no sea necesario mandar ningún año.
En el interior se crea la función flecha esBisiesto, que determina si un año es o no bisiesto.
Por otra parte, se convierte la cadena "m" a minúsculas, llamando al método toLowerCase de la clase String. La cadena se convierte a minúsculas para que, sin importar como haya sido escrito el mes (en mayúsculas, mayúscula inicial, algunas letras en mayúsculas y otras en minúsculas, etc.), en el interior del método siempre esté en minúsculas y pueda ser comparado con los nombres escritos en minúsculas. Si no se lleva a cabo la conversión y se llama al método con, por ejemplo, "Noviembre", la función lanzaría el error "No ha mandado un nombre de mes válido", porque "Noviembre" no sería igual a "noviembre". Alternativamente se puede emplear el método toUpperCase, que convierte el texto (la cadena) a mayúsculas, en ese caso, por supuesto, se tendría que comparar con los nombres escritos en mayúsculas.
Llamando a la función con algunos valores de prueba, se obtiene:
diasDelMes("marzo")
diasDelMes("agosto")
diasDelMes("diciembre")
diasDelMes("junio")
diasDelMes("noviembre")
diasDelMes("febrero")
diasDelMes("febrero", 2022)
En la penúltima instrucción, el método devuelve 29 días para el mes de febrero, mientras en la última devuelve 28. Sucede así, porque en el primer caso, como no se ha mandado el año, el método utiliza el año por defecto: 2024, que es bisiesto, mientras que en el último caso, como se le manda el año: 2022, utiliza ese año y como no es bisiesto, devuelve 28 días.
Note que los casos "enero", "marzo", "mayo", "julio", "agosto" y "octubre" no tienen ninguna instrucción (están en blanco), por lo tanto, cuando se cumple cualquiera de esos casos, el programa continúa con las instrucciones de los siguientes casos (que en este ejemplo están en blanco) hasta que encuentra el comando break (o return o throw). Es decir que, una vez que se cumple un caso, la estructura switch no verifica ningún caso más, sino que ejecuta, directamente, todas las instrucciones de todos los casos que se encuentran después del caso cumplido (hasta que encuentra el comando break o return o throw).
Para comprender mejor el este comportamiento, se ha elaborado la función "díasDelMes" (con acento), que devuelve un string (un texto) con todos los casos que son ejecutados cuando se cumple una condición:
díasDelMes = function(m, a=2024) {
m = m.toLowerCase();
let r = "";
switch (m) {
case "enero": r+="enero, ";
case "marzo": r+="marzo, ";
case "mayo": r+="mayo, ";
case "julio": r+="julio, ";
case "agosto": r+="agosto, ";
case "octubre": r+="octubre, ";
case "diciembre": r+="diciembre = 31"; break;
case "abril": r+="abril, ";
case "junio": r+="junio, ";
case "septiembre": r+="septiembre, ";
case "noviembre": r+="noviembre = 30"; break;
case "febrero": r+="febrero = "+(a.esBisiesto ? 29 : 28); break;
default: throw "Nombre de mes inválido";
}
return r;
};
Creando un objeto con el mes "diciembre" y llamando al método, se obtiene:
díasDelMes("diciembre")
Donde solo se ejecuta la instrucción de ese caso (el caso "diciembre"), porque ese caso termina con un break, por lo tanto termina la estructura switch y el programa devuelve el valor de la variable "r". Pero, si se llama al método con el mes de "julio":
díasDelMes("julio")
Se ejecutan las instrucciones de los casos: julio, agosto, octubre y diciembre, porque, como se dijo, una vez que se cumple un caso, switch, ejecuta las instrucciones de todos los casos subsiguientes hasta que encuentra el comando break (que está en el caso "diciembre"). Si ahora se llama al método con el mes de "enero":
díasDelMes("enero")
Se ejecutan todas las instrucciones desde el caso "enero" hasta el caso "diciembre" (que es donde se encuentra el comando break). Igualmente, si se llama al método con el mes de "abril":
díasDelMes("abril")
Se ejecutan las instrucciones de todos los casos desde "abril" hasta "noviembre" (que es donde se encuentra el comando break).