在w3schools tutorial中,关于switch语句的内容是:
如果默认值不是切换块中的最后一种情况,请记住结束 默认情况下带有中断。
但是,该教程还指出:
当JavaScript到达break关键字时,它将脱离开关
因此,如果您在switch语句的开头具有带有break的默认值,为什么不总是执行默认值并且解释器立即退出该块?解释器无法按顺序读取switch语句中的项目?
答案 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));