Originalmente escribí que vi una sola solución, sin embargo, durante mi sueño, se me ocurrió una solución excelente.
Tenga siempre en cuenta que un interruptor no realiza una conversión de tipo implícita para comparar los casos, de modo que si proporciona una cadena a la instrucción switch no coincidirá con enteros en los casos, y viceversa. Si desea comparar cadenas y enteros, primero deberá convertir su número entero en una cadena y luego comparar solo con cadenas.
La solución excelente:
Como ha señalado WouterH, mi solución inicial se resolverá por defecto cuando se utiliza una cadena que contiene un número, este es el comportamiento esperado para declaraciones. Pero podría ser útil analizar el argumento para superar esto. Para que pueda utilizar siguiente código:
var x = "1";
switch (isNaN(x) || parseInt(x))
{
case true:
alert("IsNaN!")
break;
case 1:
alert("1");
break;
case 2:
alert("2");
break;
case 4:
alert("4");
break;
default:
alert("default");
break;
}
Mi inicial método excelente:
var x = "clearly not a number";
switch(x){
case !isNaN(x) || x:
alert("IsNaN!")
break;
case 1:
alert("1");
break;
case 2:
alert("2");
break;
case 4:
alert("4");
break;
default:
alert("default");
break;
}
isNaN devolverá verdadero si x donde sea una cadena, pero en realidad no importa porque la verdadera won No se evalúa como verdadero para una cadena debido al comportamiento mencionado anteriormente de la declaración de cambio.
Mi solución original:
Ni siquiera sé lo que estaba pensando, esto se ve horrible y la sangría es simplemente incómodo, pero gracias por los upvotes!
var x = "clearly not a number";
switch(x){
case 1:
alert("1");
break;
case 2:
alert("2");
break;
case 4:
alert("4");
break;
case default:
if (isNaN(x)){
alert("isNaN");
break;
}
alert("default");
break;
}
solución de Brad:
THX a Brad para éste. Realmente no me gusta esto porque se siente un poco como un truco, es decir, no es así como se esperaría el uso de una declaración de caso, pero le da la mayor flexibilidad, así que estoy seguro hay un caso de uso para eso.
var x = "clearly not a number";
switch(true)
{
case x==1:
alert("1");
break;
case x==2:
alert("2");
break;
case IsNaN(x):
alert("IsNaN");
break;
case default:
alert("default");
break;
}
Creo que la única manera de hacerlo t el suyo es 'switch (true)' con sentencias 'case x === 1' y' case isNaN (x) '. No es la estructura más ideal, pero sí funciona. – Brad
Puede hacer isNan en el caso predeterminado y cambiar su lógica según corresponda – nolegs
Coloque 'case' blocks para cada otro posible valor de' x', y luego 'default' será' NaN'. :) – tenfour