2016-07-27 127 views
0

我有一个switch语句是这样的:如何在switch语句的某些情况下执行多个代码块?

switch(a) { 
    case 0: 
     // do something 
     break; 
    case 1: 
     // do something else 
     break; 
} 

我想要做的就是执行的代码,这两个块时a == 2例如。我想写这样的事情:

switch(a) { 
    case 0: 
    case 2: 
     // do something 
     break; 
    case 1: 
    case 2: 
     // do something else 
     break; 
} 

但显然,这是行不通的,因为第一个break语句结束整个switch语句。

我能想出在写辅助功能的唯一方法:

function case0() { 
    // do something 
} 

function case1() { 
    // do something else 
} 

switch(a) { 
    case 0: 
     case0(); 
     break; 
    case 1: 
     case1(); 
     break; 
    case 2: 
     case0(); 
     case1(); 
     break; 
} 

该解决方案似乎有点冗长和丑陋的我。有更好的方法来实现我想要的吗?

+1

'switch'语句很复杂。你提出的是改变他们在基础层面上的工作方式。为什么不使用可以链接到函数的映射表?例如'{2:function(){...}}'。 – tadman

+0

那么,我希望将它保存在'switch'中的主要原因是我已经在'switch'语句中构建了我的项目,我不想将它全部改写成别的东西,只是为了能够完成我所描述的内容。 – BoltKey

+0

你想要什么,JavaScript可以做什么是两件不同的事情。你想屈从于现实还是花你的生命战斗呢?如果您愿意,欢迎您[通过TC39请求ECMAScript小组](https://tc39.github.io/process-document/)。有时候,我们认为最好的方法不会出现。学习,适应,继续前进。 – tadman

回答

2

switch语句代码从第一个真实条件开始执行到最接近的break。所以在你的情况下,以下建设可能会奏效

var a = 2;//1;//0;//-1; 
switch(a){ 
    case 2: //and also one and zero 
    console.log('two'); 
    case 1: //and also zero 
    console.log('one'); 
    case 0: //zero only 
    console.log('zero'); 
    break; 
    default: //no matches 
    console.log('default'); 
} 
+0

这种类型的执行被称为执行意义下降 - 正如我的理解和你所说的 - 在没有break语句的情况下,交换机将找到第一个真实条件并落在交换机的闭合大括号中,执行每个下来的情况。这种类型的执行存在于C#,C++,Java,JavaScript和其他一些我确定的执行中。 VB.net是一种不符合普遍共识的语言。 –

+0

尽管这个答案非常接近解决问题,但它仍然不允许case 1独立执行。 – trevor

0

您询问是否有达到你想要什么更好方式...

嗯,我的解决方案无论是否有资格取决于你的“更好”的定义,但在这里它是反正:

你可以让你的switch语句是这样的:

switch(a) { 
    case 0: 
    caseHandler([0]); 
    break; 
    case 1: 
    caseHandler([1]); 
    break; 
    case 2: 
    caseHandler([0,1]); 
    break; 
} 

又通值的数组到一个帮手福使用另一个开关的部分:

function caseHandler(values) { 
    for (var i = 0; i < values.length; i++) { 
    switch (values[i]) { 
     case 0: 
     console.log('doing zero stuff'); 
     break; 
     case 1: 
     console.log('doing one stuff'); 
     break; 
    } 
    } 
} 
相关问题