admin管理员组

文章数量:1173665

I am trying to write a switch statement but it doesn't seem to work how I want.

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

The alerts gives 2 and 1 but the returned value is for (1 && 1). Why is it so? How can I fix this?

I am trying to write a switch statement but it doesn't seem to work how I want.

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

The alerts gives 2 and 1 but the returned value is for (1 && 1). Why is it so? How can I fix this?

Share Improve this question edited Mar 6, 2017 at 19:40 Charles Clayton 17.9k13 gold badges93 silver badges122 bronze badges asked Mar 5, 2017 at 18:21 ThinkerThinker 5,34615 gold badges68 silver badges142 bronze badges
Add a comment  | 

4 Answers 4

Reset to default 25

You just can't use a switch like that. (1 && 1) == (2 && 1) == 1 and (1 && 2) == (2 && 2) == 2, so you're doing the equivalent of:

    switch (exerciseId && intensity_level) {
        case (1): //...
        case (2): //...

        case (1): // same as above
        case (2): // same as above

        default:
        //...
   }

So of course the lower two cases will never execute. You're better of just using if and else if statements, or maybe nested switches if you want.

You could also do something like:

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

That isn't how a switch statement will evaluate. For your scenario it will always evaluate to the 2nd integer in the logical and &&.

(More information about Logical Operators)

Logical AND (&&)

expr1 && expr2

Returns expr1 if it can be converted to false; otherwise, returns expr2. Thus, when used with Boolean values, && returns true if both operands are true; otherwise, returns false.

You actually don't even need to use a switch, you can write it with a 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";
}

You can use switch(true) then now you can use logical operator on case.

switch (true) 
{
        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;
    }

The logical operators &&, || and ! always return true or false so the possible switch cases are only true and false. You should go with strings or numbers cases only.

本文标签: javascriptTypescript switch case with logical andStack Overflow