2010-02-22 7 views
20
for (var count = 1; count < 6; count++) { 
    switch (count) { 
     case (2): document.write("hi"); break;  
     case (count > 3): document.write("bye"); break;  
     case (count >= 4): document.write("lol"); break; 
    } 
} 

Porque no está funcionando como esperaba, no imprimiendo adiós y jajaja, me hace pensar que esto no es válido en JavaScript. Intenté buscar algunos ejemplos para ver si las personas hacen esto en Google, y no vi ninguno. Entonces, ¿esto es válido o no? o ¿Por qué podría esto no funcionar?¿Conmutador de JavaScript con operadores lógicos?

Respuesta

67

Cuando se interpreta switch, la expresión entre paréntesis se compara con los valores de los casos particulares.

En su caso, el valor de count se compararía con los valores de 2, count > 3 y count >= 4. Y eso no funcionará Aunque se puede volver a escribir y comparar con true para que funcione:

switch (true) { 
    case (count == 2): 
     document.write("hi"); 
     break; 
    case (count > 3): 
     document.write("bye"); 
     break; 
    case (count >= 4): 
     document.write("lol"); 
     break; 
} 

Pero no es así como se supone switch para ser utilizado.

Uso if declaraciones en su lugar:

if (count == 2) { 
    document.write("hi"); 
} else if (count > 3) { 
    document.write("bye"); 
} else if (count >= 4) { 
    document.write("lol"); 
} 

Editar Dado que utiliza las switch casos exclusivamente (romperse si coincide con un caso), mi switch -a- if/else traducción es correcta.

Pero el caso count >= 4/rama será aplicado desde count > 3 es cierto (también) para count valores mayores o iguales 4.

Para solucionar este problema (escribir “bye” y “lol” para los valores mayor o igual a 4), eliminar el último else para hacer la última declaración if independiente de la anterior:

if (count == 2) { 
    document.write("hi"); 
} else if (count > 3) { 
    document.write("bye"); 
} 
if (count >= 4) { 
    document.write("lol"); 
} 
+0

@Doug - the 'if (count> = 4)' expresión nunca se evaluará como verdadera en este contexto. No estoy seguro de por qué está allí. –

+0

@Doug: elimine el último 'else' en su lugar. – Gumbo

+0

Todavía hay problemas con el orden de evaluación en las instrucciones switch y if. Ver mi comentario a continuación: http://stackoverflow.com/questions/2312817/javascript-switch-with-logical-operators/3282442#3282442 –

0

intercambio debe hacerse con los dos últimos casos.

+0

Esto no es suficiente para que funcione – anthares

+0

¿Por qué? Explique por favor. – Strawberry

+0

@ anthares: no es suficiente para que funcione, pero es un error que evitará que funcione de la manera que él espera. – brian

1

Utiliza la cláusula de caso de la manera incorrecta. Debe proporcionar un valor que se compare con el valor de la cláusula switch ... y no una expresión booleana como esta count>2

En este caso, esta expresión booleana se convertirá en verdadera o falsa (1 o 0) y en comparación con su recuento de valores y, a veces puede funcionar, a veces, no.

Debería considerar reemplazarlo con sentencias if.

0

El switch normalmente necesita un condición/valor fijo; porque su variable count cambia cada vez, va en contra de eso. Use if-else condición en su lugar.

3

Esta es una corrección de Gumbo's answer. Estoy escribiendo una respuesta por separado solo porque esto no encajará como un comentario.

Edit: Gumbo sugirió en un comentario que puede haber leído mal la intención de Doug.Si el OP realmente quiere que tanto "bye" como "lol" se impriman para count> = 4, entonces necesitamos eliminar un break del switch. Los casos son ahora de nuevo en el orden original, por lo que "adiós" y "lol" se imprimen en ese orden (que al parecer es la intención de la OP.)

switch (true) { 
    case (count == 2): 
     document.write("hi"); 
     break; 
    case (count > 3): 
     document.write("bye"); 
     // No break here; just fall through. 
    case (count >= 4): 
     document.write("lol"); 
     break; 
} 

En este caso, estoy de acuerdo con el Gumbo que la la declaración revisada if es correcta.

Respuesta original sigue (se supone que la OP sea realmente quería "lol" o "adiós" para imprimir, pero no ambos.)

El switch comunicado que Gumbo wrote no va a funcionar para el recuento> = 4, por la misma razón que la declaración original de Gumbo if no funcionará: dado que los casos se evalúan en secuencia, el recuento> = 4 implica que se ejecutará el segundo caso (conteo> 3); por lo que el guión nunca llegará a la prueba de recuento> = 4. Para solucionar este problema, las pruebas deben ser ejecutados en orden inverso, de mayor a menor:

switch (true) { 
    case (count >= 4): 
     document.write("lol"); 
     break; 
    case (count > 3): 
     document.write("bye"); 
     break; 
    case (count == 2): 
     document.write("hi"); 
     break; 
} 

La declaración corregida if todavía no está bien tampoco, porque para contar> = 4 producirá ambosbye y lol en la salida. Una vez más, las pruebas dentro de la escalera if deben estar dispuestos para ir de mayor a valores más bajos:

if (count >= 4) { 
    document.write("lol"); 
} else if (count > 3) { 
    document.write("bye"); 
} else if (count == 2) { 
    document.write("hi"); 
} 

Esto no es un ejemplo ideal, porque si count es un número entero, entonces la evaluación de count >= 4 y count > 3 producirá el mismo resultados - true para el recuento> = 4, false en caso contrario. Ese no sería el caso si count es un valor de coma flotante (pero entonces, un valor de coma flotante llamado "conteo" plantearía otras preocupaciones).

+0

Doug no dio una descripción precisa sobre el resultado que esperaba ("imprimir adiós y jajaja" no es una descripción precisa). Es por eso que acabo de escribir un ejemplo de trabajo 'switch' y un ejemplo' if'-'else' equivalente a eso. – Gumbo

+0

Sabes, me lo perdí: todos estamos tan conectados para incluir un descanso en cada cláusula de caso; no se me ocurrió que el OP * quiere * que se ejecuten ambos casos. Voy a actualizar mi respuesta para cubrir ese escenario. –

Cuestiones relacionadas