web-dev-qa-db-fra.com

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 cela ne fonctionne pas comme je m'y attendais, pas d'impression bye et lol, cela me fait penser que cela n'est pas valide en JavaScript. J'ai essayé de chercher des exemples pour voir si les gens faisaient ça sur Google, et je n'en ai vu aucun. Est-ce que c'est valable ou non? ou Pourquoi cela ne fonctionnerait-il pas?

34
Strawberry

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

Donc, dans votre cas, la valeur de count serait comparée aux valeurs de 2, count > 3 et count >= 4. Et ça ne marchera pas. Bien que vous puissiez 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 ainsi que switch est censé être utilisé.

Utilisez plutôt les instructions if:

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

Modifier Puisque vous utilisez exclusivement les cas switch (casse si un cas correspond), mon switch- à -if/else la traduction est correcte.

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

Pour résoudre ce problème (écrivez "bye" et "lol" pour des valeurs supérieures ou égales à 4), supprimez le dernier else pour faire le dernier if déclaration 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");
}
91
Gumbo

Ceci est une correction de réponse de Gumbo . J'écris une réponse séparée uniquement parce que cela ne correspond pas à un commentaire.

Edit: Gumbo a suggéré dans un commentaire que j'avais peut-être mal interprété l'intention de Doug. Si l'OP veut vraiment que "bye" et "lol" soient imprimés pour le compte> = 4, alors nous devons supprimer un 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 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;
}

Dans ce cas, je suis d'accord avec Gumbo que l'instruction if révisée est correcte.

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

L'instruction switch qui Gumbo a écrit ne fonctionnera pas pour le nombre> = 4, pour la même raison que l'instruction if d'origine de Gumbo ne fonctionnera pas: parce que le les cas sont évalués en séquence, count> = 4 implique que le second cas (count> 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 élevé 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'instruction if corrigée n'est toujours pas correcte non plus, car pour count> = 4, elle produira à la fois bye et lol sur la sortie. Encore une fois, les tests dans l'échelle if doivent être organisés pour passer des valeurs les plus élevées aux plus basses:

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 count est un entier, alors évaluer count >= 4 et count > 3 produira les mêmes résultats - true pour count> = 4, false sinon. Ce ne serait pas le cas si count est une valeur à virgule flottante (mais alors, une valeur à virgule flottante nommée "count" soulèverait d'autres préoccupations.)

5
Dan Breslau

Vous utilisez la clause case dans le mauvais sens. Vous devez fournir une valeur qui sera comparée à la valeur de la clause switch ... et non une expression booléenne comme celle-ci count>2

Dans ce cas, cette expression booléenne sera convertie en vrai ou faux (1 ou 0) et comparée à votre nombre de valeurs et peut parfois fonctionner, parfois - pas.

Vous devriez envisager de le remplacer par des instructions if.

2
anthares

Vous devriez échanger vos deux derniers cas.

0
brian

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

0
Sarfraz