JS中switch的奇葩特性

大多數(shù)語(yǔ)言的 switch 語(yǔ)句的語(yǔ)法和特性都是一樣的,但是 JavaScript 語(yǔ)言中的 switch 語(yǔ)句有些特性比較特別,如果你了解其它的編程語(yǔ)言,你甚至?xí)X(jué)得這些特性更像是 JavaScript 的bug,如果你不了解這些特性,當(dāng)你無(wú)意中使用到這些特性時(shí),將會(huì)給你帶來(lái)非常難以排查的問(wèn)題;

目錄

一、switch語(yǔ)句的語(yǔ)法
二、switch語(yǔ)句的穿透特性

內(nèi)容

一、switch語(yǔ)句的語(yǔ)法

switch (expression) {
  case value1:
    // 當(dāng) expression 的結(jié)果與 value1 匹配時(shí),執(zhí)行此處語(yǔ)句
    [break;]
  case value2:
    // 當(dāng) expression 的結(jié)果與 value2 匹配時(shí),執(zhí)行此處語(yǔ)句
    [break;]
  ...
  case valueN:
    // 當(dāng) expression 的結(jié)果與 valueN 匹配時(shí),執(zhí)行此處語(yǔ)句
    [break;]
  [default:
    // 如果 expression 與上面的 value 值都不匹配時(shí),執(zhí)行此處語(yǔ)句
    [break;]]
}
  • expression : 用來(lái)與 case 子語(yǔ)句匹配的表達(dá)式。
  • case valueN : 可選; 用于匹配 expression 的 case 子句。如果 expression 與給定的 valueN 相匹配,則執(zhí)行該 case 子句中的語(yǔ)句直到該 switch 語(yǔ)句結(jié)束或遇到一個(gè) break 。
  • default : 可選;定義 default 子句,一個(gè) switch 語(yǔ)句 最多只能有一個(gè) default 子句;如果給定,這條子句會(huì)在 expression 的值與任一 case 語(yǔ)句均不匹配時(shí)執(zhí)行。

描述
一個(gè) switch 語(yǔ)句首先會(huì)計(jì)算其 expression 。然后,它將從第一個(gè) case 子句開(kāi)始直到尋找到一個(gè)其表達(dá)式值與所輸入的 expression 的值 嚴(yán)格相等(===)的子句,并執(zhí)行該子句的相關(guān)語(yǔ)句。如果沒(méi)有 case 子句相匹配,程序則會(huì)尋找那個(gè)可選的 default 子句,如果找到了,就執(zhí)行該 default 的相關(guān)語(yǔ)句。若沒(méi)有 default 子句,程序?qū)⒗^續(xù)執(zhí)行直到 switch 結(jié)束。一般情況下,會(huì)把 default 作為 switch 的最后一個(gè)子句,不過(guò)也可以把 default 子句放在 case 子句之間 或者 之前。

break 語(yǔ)句是可選的,它會(huì)使程序立即從相關(guān)的 case 子句中跳出 switch 語(yǔ)句塊,并接著執(zhí)行 switch 語(yǔ)句塊之后的語(yǔ)句。若 break 被省略,程序會(huì)繼續(xù)執(zhí)行 switch 語(yǔ)句中的下一條語(yǔ)句。

二、switch語(yǔ)句的穿透特性

因?yàn)椋?code>case valueN 用于匹配 expression 的 case 子句。如果 expression 與給定的 valueN 相匹配,則執(zhí)行該 case 子句中的語(yǔ)句直到該 switch 語(yǔ)句結(jié)束或遇到一個(gè) break ;

所以:如果匹配的 case 子句 中沒(méi)有 break ,則會(huì)執(zhí)行該 case 子句中的語(yǔ)句直到該 switch 語(yǔ)句結(jié)束,包括 default 子句 及 default 子句 之后的 case 子句,即使該 case 子句后面的 case 子句不匹配,也同樣會(huì)執(zhí)行;

示例:

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語(yǔ)句后面的語(yǔ)句");

}

測(cè)試1:匹配的 case 子句中有 break

switchTest(1)

輸出:

case 1 子句 : default之前
switch語(yǔ)句后面的語(yǔ)句

測(cè)試2:匹配的 case 子句中沒(méi)有 break

switchTest(2)

輸出:

case 2 子句 : default之前
case 3 子句 : default之前
switch語(yǔ)句后面的語(yǔ)句

測(cè)試3:匹配的 case 子句中沒(méi)有 break

switchTest(4)

輸出:

case 4 子句 : default之前
case 5 子句 : default之前
default子句
case 6 子句 : default之后
case 7 子句 : default之后

結(jié)論:
如果 case 子句 中及其之后沒(méi)有 break ,則會(huì)執(zhí)行該 case 子句中的語(yǔ)句直到該 switch 語(yǔ)句結(jié)束,包括 default 子句 及 default 子句 之后的 case 子句;

測(cè)試4:沒(méi)有與我匹配的case子句

switchTest("沒(méi)有與我匹配的case")

輸出:

default子句
case 6 子句 : default之后
case 7 子句 : default之后
switch語(yǔ)句后面的語(yǔ)句

結(jié)論:
如果 default 子句 中及其之后沒(méi)有 break ,則會(huì)執(zhí)行該 default 子句中的語(yǔ)句直到該 switch 語(yǔ)句結(jié)束,包括 default 子句 之后的 case 子句;

綜上所述,就有:

switch語(yǔ)句的穿透特性 (本人自定義的名字,非標(biāo)準(zhǔn)名字)

如果匹配的 switch子句 (case子句 或 default 子句) 中沒(méi)有 break ,則會(huì)執(zhí)行該 switch子句 中的語(yǔ)句直到該 switch 語(yǔ)句結(jié)束,包括 default 子句 及 default 子句 之后的 case 子句,即使該 case 子句后面的 case 子句不匹配,也同樣會(huì)執(zhí)行;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 控制流 Swift提供了各種控制流程語(yǔ)句。這些包括while循環(huán)多次執(zhí)行任務(wù); if,guard以及switch基...
    Fuuqiu閱讀 428評(píng)論 0 0
  • 本章將會(huì)介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語(yǔ)句Switch 語(yǔ)句控制轉(zhuǎn)移語(yǔ)句 continu...
    寒橋閱讀 802評(píng)論 0 0
  • Swift 提供了類(lèi)似 C 語(yǔ)言的流程控制結(jié)構(gòu),包括可以多次執(zhí)行任務(wù)的for和while循環(huán),基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 777評(píng)論 1 1
  • 特別說(shuō)明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 522評(píng)論 0 0
  • 這幾天和小伙伴共讀了《月亮與六便士》,開(kāi)頭的六章很晦澀,讀的很艱難,不知道作者想要表達(dá)的究竟是什么。本著對(duì)作者的...
    若渺閱讀 2,129評(píng)論 0 1

友情鏈接更多精彩內(nèi)容