while infinito funciones for ejemplo ciclo bucle array javascript switch-statement

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 de case coincidente, el programa busca la cláusula default opcional, y si se encuentra, transfiere el control a esa cláusula, ejecutando las declaraciones asociadas. Si no se encuentra una cláusula default , el programa continúa la ejecución en la instrucción siguiente al final del switch . Por convención, la cláusula default 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 .