JSの中のswitchの珍しい特性

3434 ワード

ほとんどの言語のswitch文の文法と特性は同じですが、JavaScript言語の中のswitch文の特徴は特別です.他のプログラミング言語を知ると、これらの特性はJavaScriptのbugのように感じることもあります.これらの特性を知らないなら、意図的にこれらの特性を使う時、これらの特性を理解しないでください.非常に難しい問題をもたらします.
目次
 、switch     
 、switch       
内容
一、switch文の文法
switch (expression) {
  case value1:
    //   expression      value1    ,      
    [break;]
  case value2:
    //   expression      value2    ,      
    [break;]
  ...
  case valueN:
    //   expression      valueN    ,      
    [break;]
  [default:
    //    expression      value       ,      
    [break;]]
}
  • expression:caseサブステートメントにマッチする表現.
  • case valueN:オプション;expressionにマッチするcase子文.expressionが所与のvalueNに一致する場合、switch文が終了するか、またはbreakに出会うまで、case子文の文が実行される.
  • default:オプション;default子文を定義します.一つのswitch文は一つのdefault子文しかありません.与えられた場合、このサブフレーズは、いずれのcase文にもexpressionの値が一致しない場合に実行されます.
  • switch文を記述すると、まずそのexpressionを計算します.そして、最初のcase子文から、その表現値が入力されたexpressionの値に厳密に等しい(=====)という子文を見つけて、その子文に関する語句を実行します.case子句がマッチしていない場合は、プログラムはそのオプションのdefault子文を探します.見つかったらdefaultの関連文を実行します.default子文がない場合は、プログラムはswitchが終わるまで実行されます.一般的にはdefaultをswitchの最後のサブフレーズとしますが、default子文をcase子文の間や前に置いてもいいです.
    break文はオプションであり、関連するcase文からプログラムを直ちにswitch文のブロックから飛び出させ、switch文のブロックの後の文を実行します.breakが省略されると、プログラムは引き続きswitch文の次の文を実行します.
    二、switch文の浸透特性
    なぜなら:case valueNは、expressionにマッチするcaseサブフレーズに使用されるからである.expressionが所与のvalueNに一致する場合、switch文が終了するか、またはbreakに出会うまで、case子文の文を実行する.
    したがって、マッチするcase子文にbreakがない場合、このcase子文の文はこのswitch文の最後まで実行され、default子文とdefault子文の後のcase子文を含み、たとえそのcase子文の後のcase子文が一致しなくても同様に実行される.
    例:
    function switchTest(value) {
    
        switch (value) {
            case 1:
                console.log("case 1    : default  ");
                break;
    
            case 2:
                console.log("case 2    : default  ");
    
            case 3:
                console.log("case 3    : default  ");
                break;
    
            case 4:
                console.log("case 4    : default  ");
    
            case 5:
                console.log("case 5    : default  ");
    
            default:
                console.log("default  ");
    
            case 6:
                console.log("case 6    : default  ");
    
            case 7:
                console.log("case 7    : default  ");
        }
    
        console.log("switch       ");
    
    }
    
    テスト1:マッチするcase子文にbreakがあります.
    switchTest(1)
    
    出力:
    case 1    : default  
    switch       
    
    テスト2:マッチするcase子文にはbreakがありません.
    switchTest(2)
    
    出力:
    case 2    : default  
    case 3    : default  
    switch       
    
    テスト3:マッチするcase子文にはbreakがありません.
    switchTest(4)
    
    出力:
    case 4    : default  
    case 5    : default  
    default  
    case 6    : default  
    case 7    : default  
    
    結論:case子文の中でそれ以降にbreakがない場合、そのcase子文の中の文はこのswitch文の最後まで実行され、default子文とdefault子文の後のcase子文を含む.
    テスト4:私とマッチするcase子文がありません.
    switchTest("       case")
    
    出力:
    default  
    case 6    : default  
    case 7    : default  
    switch       
    
    結論:default子文中およびその後breakがない場合、default子文中の文はこのswitch文が終わるまで、default子文後のcase子文を含む.
    以上より、次のようになります.
    switch文の浸透特性(本人がカスタマイズした名前で、標準名ではない)
    マッチするswitch子文にbreakがない場合は、このswitch子文の中の文が最後まで実行されます.default子文とdefault子文の後のcase子文が含まれています.case子文の後のcase子文が一致しなくても、同様に実行されます.