web-dev-qa-db-ja.com

論理的および

Switchステートメントを記述しようとしていますが、私が望むようには動作しないようです。

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

アラートは2と1を返しますが、戻り値は(1 && 1)のものです。なぜそうですか?どうすれば修正できますか?

8
Thinker

そのようなswitchを使用することはできません。 (1 && 1) == (2 && 1) == 1および(1 && 2) == (2 && 2) == 2であるため、次と同等の操作を実行しています。

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

したがって、もちろん下の2つのケースは実行されません。 ifおよびelse ifステートメントを使用するか、必要に応じて入れ子になったスイッチを使用することをお勧めします。

次のようなこともできます:

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

switch ステートメントの評価方法ではありません。シナリオでは、常に論理値の2番目の整数に評価され、&&

論理演算子 )に関する詳細情報

論理AND(&&)

expr1 && expr2

Falseに変換できる場合、expr1を返します。それ以外の場合、expr2を返します。したがって、ブール値で使用すると、&&は両方のオペランドがtrueの場合にtrueを返します。それ以外の場合は、falseを返します。

実際にスイッチを使用する必要さえありません。単純な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

論理演算子&&||および!は常にtrueまたはfalseを返すため、考えられるスイッチケースはtrueとfalseのみです。文字列または数字のケースのみを使用する必要があります。

0
Babar Bilal