js在交换机中重复的情况

时间:2018-02-23 00:16:53

标签: javascript switch-statement

在回答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;
}

3 个答案:

答案 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)来分派到不同的操作。