infinito - if en javascript
¿Por qué la sentencia Switch solo funciona con la palabra clave true? (3)
El parámetro que se le da al interruptor se comparará usando ===
. En los casos que tienes, tienes expresiones que dan como resultado un tipo boolean
: n==0 || n==1
n==0 || n==1
o n >= 2
. Cuando pasa un número, intenta comparar su número con un resultado dado por la expresión en los casos. Entonces, por ejemplo, con el número 1
dado intenta comparar 1 === (1 == 0 || 1 == 1)
-> 1 === true
que devuelve falso (comparación estricta). Entonces obtienes el texto Default
todo el tiempo.
Para el primer caso, necesita tener números en los cases
de su cambio, no un boolean
( n==0 || n==1
resultados en boolean
).
Con el segundo caso, tiene en el valor del interruptor true
de tipo boolean
. Cuando pasa nuevamente 1
la comparación funciona como true === (1 == 0 || 1 == 1)
-> true === true
y devuelve verdadero. Entonces obtienes el resultado deseado de acuerdo con tu valor n
. Pero el segundo caso no tiene objetivos con el uso de true
como valor. Puede reemplazarlo con una declaración if else if
.
Si desea obtener el mismo resultado para muchos casos, necesita escribir 2 casos uno encima del otro. Mira esto
case 0:
case 1:
result
Aquí los casos tienen number
tipo, no boolean
.
Ejemplo de código
function test(n){
switch (n) {
case 0:
case 1:
console.log("Number is either 0 or 1");
break;
case 2:
console.log("Number is 2")
break;
default:
console.log("Default");}
}
test(0);
test(1);
test(2)
¿Alguien puede explicarme por qué el primero no funciona y el segundo funciona?
Primera declaración
function test(n) {
switch (n) {
case (n == 0 || n == 1):
console.log("Number is either 0 or 1");
break;
case (n >= 2):
console.log("Number is greater than 1")
break;
default:
console.log("Default");
}
}
Segunda declaración
function test(n) {
switch (true) {
case (n == 0 || n == 1):
console.log("Number is either 0 or 1");
break;
case (n >= 2):
console.log("Number is greater than 1")
break;
default:
console.log("Default");
}
}
switch
usa una comparación estricta.
Tomas un número en la instrucción switch y, en los casos, solo comparsions que devuelven un valor booleano.
Una instrucción switch primero evalúa su expresión. Luego busca la primera cláusula de
case
cuya expresión evalúa el mismo valor que el resultado de la expresión de entrada (usando la comparación estricta ,===
) y transfiere el control a esa cláusula, ejecutando las declaraciones asociadas. (Si varios casos coinciden con el valor proporcionado, se selecciona el primer caso que coincida, incluso si los casos no son iguales entre sí.) Si no se encuentra ninguna cláusula decase
coincidente, el programa busca la cláusuladefault
opcional, y si se encuentra, transfiere el control a esa cláusula, ejecutando las declaraciones asociadas. Si no se encuentra una cláusuladefault
, el programa continúa la ejecución en la instrucción siguiente al final delswitch
. Por convención, la cláusuladefault
es la última cláusula, pero no tiene que ser así.
switch
es una abreviatura de un grupo de if
s.
switch(n) {
case x:
a();
break;
case y:
b();
break;
}
... es equivalente a:
if(n == x) {
a();
} else if(n == y) {
b();
}
Entonces, tu primer pedazo de código:
switch (n) {
case (n==0 || n==1):
console.log("Number is either 0 or 1");
break;
case (n>=2):
console.log("Number is greater than 1")
break;
default:
console.log("Default");}
}
... es equivalente a:
if(n == (n==0 || n==1)) {
console.log("Number is either 0 or 1");
} else if ( n == ( n >= 2)) {
console.log("Number is greater than 1");
} else {
console.log("Default");
}
Espero que puedas ver que n == (n==0 || n==1)
n == ( n >= 2)
son dos tonterías. Si n
es 0, por ejemplo, el primero evaluará a 0 == true
. En muchos idiomas, esto causará un error de compilación (comparando diferentes tipos). ¡No quiero especialmente pensar en lo que hace en Javascript!
Tu segundo ejemplo:
switch (true) {
case (n==0 || n==1):
console.log("Number is either 0 or 1");
break;
case (n>=2):
console.log("Number is greater than 1")
break;
default:
console.log("Default");
}
Es equivalente a:
if(true == (n==0 || n==1)) {
console.log("Number is either 0 or 1");
} else if(true == (n>=2)) {
console.log("Number is greater than 1");
} else {
console.log("Default");
}
... en el que al menos los enunciados de condición true == (n==0 || n==1)
y true == (n >=2)
tienen sentido.
Pero esta es una forma poco convencional de usar el switch
en la mayoría de los idiomas. La forma normal es usar el valor que está probando como parámetro para switch
y para cada case
ser un valor posible para él:
switch(n) {
case 0:
case 1:
console.log("n is 0 or 1");
break;
case 2:
console.log("n is 2);
break;
default:
console.log("n is some other value");
}
Sin embargo, el switch
no proporciona un case
más inteligente que un control de igualdad completo. Entonces no hay case >2 && <5
.
Tu puedes usar tu truco usando el switch(true)
(en Javascript - hay muchos idiomas en los que esto no funcionará), o usa if
/ else
.