web-dev-qa-db-ja.com

論理演算子を使用したJavaScriptスイッチ?

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

さようならや笑いを印刷するのではなく、期待どおりに動作しないため、JavaScriptでこれが無効であると思わせます。 Googleでこれを行うかどうかを確認するためにいくつかの例を探してみましたが、何も表示されませんでした。これは有効ですか?またはなぜこれが機能しないのですか?

34
Strawberry

switch が解釈されると、括弧内の式が特定のケースの値と比較されます。

したがって、あなたの場合、countの値は、2count > 3、およびcount >= 4の値と比較されます。そして、それはうまくいきません。書き換えて、trueと比較して動作させることができますが:

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

しかし、それはswitchの使用方法ではありません。

代わりにifステートメントを使用します。

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

Editswitchケースのみを使用するため(ケースが一致する場合は中断します)、my switch- to -if/else翻訳は正しいです。

しかし、count >= 4 case/branchは、countの値が4以上の場合、count > 3が(また)trueであるため、決して適用されません。

この問題を解決するには(「bye」「lol」を4以上の値に書き込む)、最後のelseを削除して最後のifを作成します上記とは独立したステートメント:

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

これは Gumboの答え の修正です。これがコメントとして収まらないので、私は別の答えを書いています。

編集:ガンボは、ダグの意図を誤解した可能性があるとコメントで示唆しました。 OPがカウント> = 4で「bye」と「lol」の両方を印刷することを本当に望む場合、breakからswitchを削除する必要があります。ケースは元の順序に戻っているため、「bye」と「lol」はその順序で印刷されます(明らかに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;
}

この場合、改訂されたifステートメントが正しいことをガンボに同意します。

元の回答が続きます(OPが実際にどちらかのどちらかを印刷することを望んでいると仮定しますが、両方ではありません。)

Gumboが書いた というswitchステートメントは、Gumboの元のifステートメントが機能しないのとほぼ同じ理由で、カウント> = 4では機能しません。ケースは順番に評価され、カウント> = 4は2番目のケース(カウント> 3)が実行されることを意味します。したがって、スクリプトはカウント> = 4のテストに到達しません。これを修正するには、テストを最高から最低の逆の順序で実行する必要があります。

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

修正されたifステートメントはまだ正しくありません。カウント> = 4の場合、出力でbothbyeおよびlolが生成されるためです。繰り返しますが、ifラダー内のテストは、最高値から最低値に行くように調整する必要があります。

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

countが整数の場合、count >= 4count > 3を評価すると同じ結果が得られるため、これは理想的な例ではありません-カウントのtrue 4、falseそれ以外。 countが浮動小数点値である場合はそうではありません(ただし、「count」という名前の浮動小数点値は他の懸念を引き起こすでしょう)。

5
Dan Breslau

ケース句を間違った方法で使用しています。 switch句の値と比較される値を指定する必要があります...このようなブール式ではなく、count>2

この場合、このブール式はtrueまたはfalse(1または0)にキャストされ、値のカウントと比較され、動作する場合と動作しない場合があります。

Ifステートメントで置き換えることを検討する必要があります。

2
anthares

最後の2つのケースを交換する必要があります。

0
brian

switchは通常、固定条件/値が必要です。 count変数は毎回変更されるため、それに反します。代わりにif-else条件を使用してください。

0
Sarfraz