当默认值未结束时,在switch语句中使用默认值后中断

时间:2019-05-10 21:02:52

标签: javascript switch-statement

在w3schools tutorial中,关于switch语句的内容是:

  

如果默认值不是切换块中的最后一种情况,请记住结束   默认情况下带有中断。

但是,该教程还指出:

  

当JavaScript到达break关键字时,它将脱离开关   

因此,如果您在switch语句的开头具有带有break的默认值,为什么不总是执行默认值并且解释器立即退出该块?解释器无法按顺序读取switch语句中的项目?

3 个答案:

答案 0 :(得分:2)

如本教程所述

  

default关键字指定在没有case匹配项的情况下要运行的代码

default关键字的位置无关紧要,在执行default情况下的代码之前,将先测试关键字之后的情况。如果其中一种情况匹配,则将执行其代码,因此不会执行break块中的default

default之后的代码仅在没有明确的大小写匹配或选择了default之前的大小写且break之前没有default的情况下才执行(因此,掉进来)。

default:的情况通常是按照惯例写在最后,因此通常不需要break。本教程中的警告仅提醒您,如果您将default:放在前面,则仍然适用于在没有break的情况下继续进行下一种情况的规则; default规则没有什么可以阻止它的。

答案 1 :(得分:1)

这是在ECMA-262, 13.12.9 Runtime Semantics: CaseBlockEvaluation中指定的(这是JavaScript的定义)。

不幸的是,该规范有点难以理解,但可以归结为以下几点:要执行switch语句,请尝试在case之前的default子句;然后尝试在case之后的default子句(如果有);并且仅当它们都不匹配时,才执行default部分。 default的位置无关紧要。

答案 2 :(得分:1)

从该tutorial您还可以阅读:

  

default关键字指定在不区分大小写匹配的情况下运行的代码。

例如,如果在开头定义了case匹配项,则将执行与该匹配项关联的代码,而不是与默认块关联的代码,例如:

function test(n)
{
    let res;

    switch (n)
    {
        default: 
            res = "default";
            break;
        case 1:
            res = "Case 1";
            break; 
        case 0:
            res = "Case 2";
     }

     return res;
}

console.log(test(1), test(0), test(9));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

如您所见,default块仅在不匹配时才执行(例如在test(9)上)。现在,关于此:

  

如果default不是switch块中的最后一种情况,请记住以default结尾break情况。

您可以阅读下一条警告:

  

注意:如果省略break语句,即使评估结果与大小写不匹配,也会执行 next 大小写。

因此,例如,如果我们在上一个示例中省略了break语句,那么在默认情况下,我们将不会获得预期的default字符串,而是将获得字符串{{ 1}}:

Case 1
function test(n)
{
    let res;

    switch (n)
    {
        default: 
            res = "default";
        case 1:
            res = "Case 1";
            break; 
        case 0:
            res = "Case 2";
     }

     return res;
}

console.log(test(1), test(0), test(9), test(99));