在回答this问题时,最受欢迎的答案是这是最好的方法:
switch(variable) {
case 0:
// operation A;
case 1:
// operation B;
break;
}
但是如果在操作A之前必须执行操作B怎么办?在这种情况下,这是可以接受的,还是有更好的解决方案:
switch(variable) {
case 0:
case 1:
// operation B;
break;
case 0:
// operation A;
break;
}
答案 0 :(得分:3)
中断将迫使你离开开关,在这样的情况下,最好将操作加倍如此
switch(variable){
case 0:
//operation B
//Operation A
break;
case 1:
// Operation A
break;
}
避免过多加倍代码的最佳方法是将操作A和B分解为单独的函数,这意味着开关只需要2行即可。
switch(variable){
case 0:
this.DoOperationB(variables)
this.DoOperationA(variables)
break;
case 1:
this.DoOperationA(variables)
break;
}
答案 1 :(得分:3)
要强制这两种情况执行进程B,我们可以按顺序列出它们而没有break
语句,然后使用if
语句而不是您以前执行的重复case
语句案例1不需要操作。
switch(variable) {
case 0:
case 1:
// operation B;
if(variable === 0) //operation A ;
break;
}
或者,如果过程B在过程A之前,无论情况如何,嵌套函数都将是一个很好的解决方案。
process_A = function(){
process_B();
console.log("running operation A");
//operation A;
}
process_B = function(){
console.log("running operation B");
//operation B;
}
variable = 0;
switch(variable) {
case 0:
process_A();
break;
case 1:
process_B();
break;
}
在交换表中包含重复个案是没有意义的。只有1个案例将被变量索引。如果您需要条件之间的复杂关系,您可能需要使用ifelse
块或Rando解决方案中的某些内容。
以下代码段演示了为什么不应在切换表中使用重复个案的原因:
var variable = 0;
switch(variable) {
case 0:
console.log("case 0: No Op performed");
case 1:
// operation B;
console.log("case 1: Op B performed");
break;
case 0:
// operation A;
console.log("case 0: Op A performed");
break;
}
注意操作A永远不会运行。
切换表类似于数组。每种情况都是表的索引,它允许我们快速处理条件,而不是线性向下移动ifelse
块。当我们索引切换表时,我们执行从该索引到表末尾的所有命令或直到第一个break
答案 2 :(得分:0)
易于测试,看到它并不像你想要的那样工作:
function doStuff(x) {
console.log(`with ${x}:`);
switch (x) {
case 0:
case 1:
console.log("operation B");
break;
case 0:
console.log("operation A");
break;
}
}
doStuff(0);
doStuff(1);

第二个case 0
虽然在语法上是合法的,但代码永远不会达到。在这些情况下,通常最好合适地合并case
标签,然后使用if
s(甚至更多switch
es)来分派到不同的操作。