Commutateur JavaScript avec opérateurs logiques?

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

Parce que ça ne fonctionne pas de la façon dont je m'attends, sans imprimer bye et lol, cela me fait penser que cela n'est pas valable dans JavaScript. J'ai essayé de chercher des exemples pour voir si les gens le font sur Google et je n'en ai vu aucun. Est-ce que cela est valable ou non? Ou pourquoi cela ne fonctionnerait pas?

Lorsque le switch est interprété, l'expression entre parenthèses est comparée aux valeurs des cas particuliers.

Donc, dans votre cas, la valeur du count serait comparée aux valeurs de 2 , count > 3 et count >= 4 . Et cela ne fonctionnera pas. Même si vous pouvez le réécrire et le comparer à true pour le faire fonctionner:

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

Mais ce n'est pas la façon dont le switch est censé être utilisé.

Utilisez les instructions if à la place:

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

Edition Étant donné que vous utilisez exclusivement les cas de switch (pause si un cas correspond), ma traduction de switch -à- if / else est correcte.

Mais le count >= 4 cas / branche ne sera jamais appliqué puisque count > 3 est vrai (aussi) pour les valeurs de count supérieures ou égales 4.

Pour corriger ce problème (écrire "bye" et "lol" pour des valeurs supérieures ou égales 4), supprimez le dernier else pour que la dernière instruction if indépendante de la précédente:

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

Vous utilisez la clause de cas de manière incorrecte. Vous devez fournir une valeur qui sera comparée à la valeur de la clause de commutation … et non une expression booléenne comme celle-ci count>2

Dans ce cas, cette expression booléenne sera transmise à true ou false (1 ou 0) et comparée à votre nombre de valeurs et peut parfois fonctionner, parfois – pas.

Vous devriez envisager de le remplacer par des déclarations if.

C'est une correction à la réponse de Gumbo . J'écris une réponse distincte uniquement parce que cela ne correspond pas à un commentaire.

Edit: Gumbo a suggéré dans un commentaire que j'ai peut-être mal compris l'intention de Doug. Si l'OP veut vraiment que "bye" et "lol" soient imprimés pour compter> = 4, alors nous devons supprimer une break du switch . Les cas sont maintenant de retour dans l'ordre d'origine, de sorte que "bye" et "lol" sont imprimés dans cet ordre (ce qui est apparemment l'intention du 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; } 

Dans ce cas, je suis d'accord avec Gumbo que l'énoncé if révisé est correct.

La réponse d'origine suit (suppose que l'OP voulait vraiment "lol" ou "bye" imprimer, mais pas les deux.)

L'énoncé de switch que Gumbo a écrit ne fonctionnera pas pour le compte> = 4, pour la même raison que l'affirmation originale d'origine de Gumbo ne fonctionnera pas: car les cas sont évalués en séquence, compter> = 4 implique que le second cas (compter > 3) sera exécuté; De sorte que le script n'atteindra jamais le test pour count> = 4. Pour résoudre ce problème, les tests doivent être exécutés dans l'ordre inverse, du plus haut au plus bas:

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

L'énoncé if corrigé n'est pas correct non plus, car pour count> = 4, il produira à la fois bye et lol sur la sortie. Encore une fois, les tests dans l'échelle if devraient être organisés pour passer des valeurs les plus élevées à la plus basse:

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

Ce n'est pas un exemple idéal, car si le count est un nombre entier, alors l'évaluation count >= 4 et le count > 3 produira les mêmes résultats – true pour le compte> = 4, false sinon. Ce ne serait pas le cas si le count est une valeur à virgule flottante (mais alors, une valeur à virgule flottante appelée «compte» soulèverait d'autres préoccupations).

Vous devriez échanger vos deux derniers cas.

Le switch normalement besoin d'une condition / valeur fixe ; Parce que votre variable de count change à chaque fois, cela va à l'encontre de cela. Utilisez à la place if-else condition.