web-dev-qa-db-fra.com

Commutateur dactylographié avec logique et

J'essaie d'écrire une instruction switch mais cela ne semble pas fonctionner comme je le veux.

getExerciseDescription(exerciseId, intensity_level){

    alert(exerciseId + " " + intensity_level)

    switch (exerciseId && intensity_level) {
        case (1 && 1):
        this.header="Exercise 1 Level 1";
        this.instructions="Exercise 1 Level 1";
        break;
        case (1 && 2):
        this.header="Exercise 1 Level 2";
        this.instructions="Exercise 1 Level 2";
        break;  


        case (2 && 1):
        this.header="Exercise 2 Level 1";
        this.instructions="Exercise 2 Level 1";
        break;  
        case (2 && 2):
        this.header="Exercise 2 Level 2";
        this.instructions="Exercise 2 Level 2";
        break;

        default:
        this.header="Default";
        this.instructions="Default";
        break;
    }

    return new Popup(this.header, this.instructions);
} 

Les alertes donnent 2 et 1 mais la valeur renvoyée est pour (1 && 1). Pourquoi est-ce? Comment puis-je réparer cela?

6
Thinker

Vous ne pouvez tout simplement pas utiliser une switch comme ça. (1 && 1) == (2 && 1) == 1 et (1 && 2) == (2 && 2) == 2, vous faites donc l'équivalent de: 

getExerciseDescription(exerciseId, intensity_level){

    alert(exerciseId + " " + intensity_level)

    switch (exerciseId && intensity_level) {
        case (1):
        this.header="Exercise 1 Level 1";
        this.instructions="Exercise 1 Level 1";
        break;
        case (2):
        this.header="Exercise 1 Level 2";
        this.instructions="Exercise 1 Level 2";
        break;  


        case (1):
        this.header="Exercise 2 Level 1";
        this.instructions="Exercise 2 Level 1";
        break;  
        case (2):
        this.header="Exercise 2 Level 2";
        this.instructions="Exercise 2 Level 2";
        break;

        default:
        this.header="Default";
        this.instructions="Default";
        break;
    }

    return new Popup(this.header, this.instructions);
} 

Alors bien sûr, les deux cas inférieurs ne seront jamais exécutés. Il vaut mieux utiliser uniquement les instructions if et else if, ou peut-être des commutateurs imbriqués si vous le souhaitez. 

Vous pouvez aussi faire quelque chose comme:

switch (exerciseId + " " + intensity_level) {
    case("1 1"): ...
    case("1 2"): ...
    case("2 1"): ...
    case("2 2"): ...
9
Charles Clayton

Ce n’est pas ainsi qu’une déclaration switch sera évaluée. Pour votre scénario, il sera toujours évalué au 2e entier de la logique et à &&

(Plus d'informations sur Opérateurs logiques )

ET logique (&&)

expr1 && expr2

Retourne expr1 s'il peut être converti en false; sinon, renvoie expr2. Ainsi, lorsqu'il est utilisé avec des valeurs booléennes, && renvoie true si les deux opérandes sont vrais; sinon, renvoie false.

En fait, vous n'avez même pas besoin d'utiliser un commutateur, vous pouvez l'écrire avec un simple if

if (exerciseId <= 2 && intensity_level <= 2){
    this.header=`Exercise ${exerciseId} Level ${intensity_level}`;
    this.instructions=`Exercise ${exerciseId} Level ${intensity_level}`;
} else {
    this.header="Default";
    this.instructions="Default";
}
1

Les opérateurs logiques &&, || et ! renvoient toujours true ou false, de sorte que les cas de commutation possibles sont uniquement vrais et faux. Vous ne devriez utiliser que des chaînes ou des nombres.

0
Babar Bilal