23

最近、switch ステートメントが、switch 内の答え (ブール値) と case 内の式で逆になっているように見えるコードに出くわしました。コードは意図したとおりに正常に実行されましたが、クロス ブラウザーが心配です。有効なJavaScriptですか?

switch(true) {
  case (y < 20):
    //
    break;
  case (y < 60):
    //
    break;
  case (y < 130):
    //
    break;
}
4

5 に答える 5

12

このスニペットは完全に問題ありません。これは、次の表現の別の方法です。

if (y < 20) {
    // ...
} else if (y < 60) {
    // ...
} else if ( y < 130) {
    // ...
}
于 2013-01-02T08:37:40.103 に答える
7

はい、有効です。

多くの「現代」言語と同様にswitch、Javascriptのinは、C言語の元のintベースswitchからは非常に遠く、一般的なセマンティクスのみを保持します。

ECMAScriptで正規化されているように、switch句について詳しく説明します:http ://www.ecma-international.org/ecma-262/5.1/#sec-12.11

基本的に、値がinの式と等しい最初のケースswitch(Expression)が実行されます。

if else if明らかなシーケンスに対する主な利点は、breakステートメントを省略して複数のブロックを実行できることです。古いCスイッチとは異なり、実際のパフォーマンスの向上はなく、この場合、より簡潔でも読みやすくもないことに注意してください。

于 2013-01-02T08:38:11.650 に答える
7

switch ステートメントの構文は次のとおりです。

SwitchStatement :  
  switch ( Expression ) CaseBlock  
CaseBlock :  
  { CaseClauses(opt) }  
  { CaseClauses(opt) DefaultClause CaseClauses(opt) }  
CaseClauses :  
  CaseClause  
  CaseClauses CaseClause  
CaseClause :  
  case Expression : StatementList(opt)  
DefaultClause :  
  default : StatementList(opt)

switch 式または case 式は、数値、文字列、ブール値などである必要があります。trueは、switch 式としてy < 20完全に受け入れられ、case 式として完全に受け入れられます。switch 式と case 式の比較は、===演算子を使用して行われることに注意してください。

投稿したコードでは、最初のケースは、が検出されるか、switch ブロックが終了するtrueまで実行されます。break

于 2013-01-02T09:13:30.907 に答える
2

ケースは、の値に基づいて実行されますy

条件はの値に依存するためですyaefxxが言ったように、それは次の別の形式です。

if (y < 20) {
    // ...
} elseif (y < 60) {
    // ...
} elseif ( y < 130) {
    // ...
}
于 2013-01-02T08:39:09.000 に答える
2

有効です。

コード

switch(f0()) {
    case f1(): ..; 
    case f2(): ..;
    default: dflt;
}

whereは任意の式を表しますfX()(強制評価を示すために関数呼び出しが使用されます) は、次のようにほぼ書き直すことができます。

for (;;) { // for "break"
    var _x = f0()
    if (_x === f1()) { .. }
    if (_x === f2()) { .. }
    dflt;
    break;
}

つまり、の式case評価され、 の式と比較されswitchます。(これは、式で定数値を必要とする C や Java などの言語とは大きく異なりますcase。)

もちろん、break標準のフォールスルー セマンティクスとは対照的に、 は「スイッチを終了」します。そのため、 にtrue提供される式はwhere でありswitch、投稿された例はif/else ifaefxx で示される と意味的に同等です。

于 2013-01-02T09:04:16.343 に答える