2010-02-22 16 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; 
    } 
} 

Poiché non funziona come previsto, non stampando bye e lol, mi viene da pensare che questo non sia valido in JavaScript. Ho provato a cercare alcuni esempi per vedere se la gente lo fa su Google e non ne ho visto nessuno. Quindi è valido o no? o perché questo non funziona?Cambio JavaScript con operatori logici?

risposta

67

Quando viene interpretato switch, l'espressione tra parentesi viene confrontata con i valori dei casi particolari.

Quindi nel tuo caso il valore di count verrebbe confrontato con i valori di 2, count > 3 e count >= 4. E questo non funzionerà. Anche se è possibile riscrivere e confrontare true per farlo funzionare:

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

Ma non è come switch dovrebbe essere utilizzato.

Usa if dichiarazioni invece:

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

Modifica Dal momento che si utilizzano i switch casi esclusivamente (rompersi se un caso partite), il mio switch -a- if/else traduzione sia corretta.

Ma non sarà mai applicato il count >= 4 caso/ramo dal count > 3 è vero (anche) per count valori maggiori o uguali 4.

per risolvere questo problema (scrivere “bye” e “lol” per i valori maggiore o uguale a 4), rimuovere l'ultima else effettuare l'ultima if dichiarazione indipendente dal precedente:

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

@Doug - il 'if (count> = 4)' espressione non valuterà mai il vero in questo contesto. Non sono sicuro del motivo per cui è lì. –

+0

@Doug: rimuovi l'ultimo 'else' a volontà. – Gumbo

+0

Ci sono ancora problemi con l'ordine di valutazione sia nelle istruzioni switch che if. Vedere il mio commento qui sotto: http://stackoverflow.com/questions/2312817/javascript-switch-with-logical-operators/3282442#3282442 –

0

Si dovrebbe scambiare i tuoi ultimi due casi.

+0

Questo non è sufficiente per farlo funzionare – anthares

+0

Perché? Spiega per favore. – Strawberry

+0

@ anthares: non abbastanza per farlo funzionare, ma è un bug che gli impedirà di funzionare nel modo in cui si aspetta. – brian

1

Si utilizza la clausola case nel modo sbagliato. È necessario fornire un valore che verrà confrontato con il valore nella clausola switch ... e non con un'espressione booleana come questa count>2

In questo caso questa espressione booleana verrà convertita in true o false (1 o 0) e rispetto al conteggio del valore ea volte può funzionare, a volte - no.

Si dovrebbe prendere in considerazione la sostituzione con istruzioni if.

0

Il switch normalmente ha bisogno di un fisso condizione/valore; perché la tua variabile count cambia ogni volta, va contro quella. Utilizzare invece la condizione if-else.

3

Questa è una correzione a Gumbo's answer. Sto scrivendo una risposta separata solo perché questo non si adatta come un commento.

Modifica: Gumbo ha suggerito in un commento che potrei aver letto male l'intenzione di Doug.Se l'OP vuole davvero sia "ciao" che "lol" da stampare per conteggio> = 4, allora dobbiamo rimuovere uno break dal switch. I casi sono ora di nuovo nell'ordine originale, in modo che "bye" e "lol" sono stampati in questo ordine (che è apparentemente l'intenzione del PO.)

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; 
} 

In questo caso, sono d'accordo con Gumbo che la la revisione dell'istruzione if è corretta.

risposta originale segue (presuppone che il PO voleva davvero sia "lol" o "arrivederci" per stampare, ma non entrambi.)

Il switch affermazione che Gumbo wrote non funzionerà per il conteggio> = 4, per lo stesso motivo per cui l'istruzione originale di Gumbo if non funzionerà: poiché i casi vengono valutati in sequenza, il conteggio> = 4 implica che il secondo caso (conteggio> 3) verrà eseguito; così lo script non raggiungerà mai il test per il conteggio> = 4. Per risolvere il problema, i test dovrebbero essere eseguiti in ordine inverso, dal più alto al più basso:

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

Il corretto if affermazione non è ancora quello giusto sia, perché per il conteggio> = 4 produrrà siabye e lol sull'output. Ancora una volta, i test all'interno della scaletta if devono essere disposti per passare da alto a valori più bassi:

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

Questo non è un esempio ideale, perché se count è un numero intero, valutando count >= 4 e count > 3 produrrà stesso risultati - true per il conteggio> = 4, false in caso contrario. Questo non sarebbe il caso se count è un valore a virgola mobile (ma poi, un valore a virgola mobile denominato "conteggio" solleverebbe altri problemi).

+0

Doug non ha fornito una descrizione precisa del risultato che si aspettava ("stampare bye e lol" non è una descrizione precisa). Ecco perché ho appena scritto un esempio di 'switch' funzionante e un equivalente' if'-'else' esempio. – Gumbo

+0

Lo sai, mi sono perso: siamo tutti così difficili da includere una pausa in ogni clausola; non mi è venuto in mente che l'OP * vuole * entrambi i casi da eseguire. Ho intenzione di aggiornare la mia risposta per coprire questo scenario. –

Problemi correlati