使一部分转换声明案件落空但不是全部?

时间:2014-07-29 17:19:30

标签: javascript switch-statement

可能没有什么区别,因为问题是基本的控制结构,但我是用Javascript写的。 (如果发生这种情况则标记为这样)

我熟悉这种类型的开关语句 case 'foo': case 'bar': do a; do b; do c; break;

有没有办法让案件的一部分落空并适用于下一个案件但不是全部?也就是说,交换机的语法是否相当于:

if(my_var == 'foo' || my_var == 'bar') do a;
if(my_var == 'foo') do b;
if(my_var == 'bar') do c;

我觉得它应该是我常见的缺失,因为它似乎是一个非常有用的想法。

4 个答案:

答案 0 :(得分:2)

不,遗憾的是,对于普通的switch语句,这是不可能的。

例如,解决方案是将其拆分为两个switch语句。

switch (x) {
    case 'foo':
    case 'bar':
        a();
}

switch (x) {
    case 'foo':
        b();
        break;
    case 'bar':
        c();
}

或者,正如乔建议的那样,只需重复一下这个功能:

switch (x) {
    case 'foo':
        a();
        b();
        break;
    case 'bar':
        a();
        c();
}

使用更短的解决方案......这取决于具体情况。

答案 1 :(得分:2)

您无法做到这一点 - 只需将您的操作分离为可由任何案例调用的函数。它会使事情变得美观和可读。

var funcA = function() { /* do a */ };

switch (x) {
    case 'foo':
         funcA();
         funcB();
         break;
    case 'bar':
         funcA();
         funcC();
         break;
}

答案 2 :(得分:1)

我会这样做:

if (my_var == 'foo' || my_var == 'bar') {
  do a;
}

switch (my_var) {
   case 'foo':
     do b;
     break;
   case 'bar':
     do c;
     break;
}

我认为这使得逻辑对读者来说最清楚。

答案 3 :(得分:1)

如果只有foobar分支是特殊的,并且您还有switch的其他分支,则可以将if个语句放入foobar的公共分支:

switch (my_var) {
  case 'foo':
  case 'bar':
    do a;
    if (my_var == 'foo') do b;
    if (my_var == 'bar') do c;
    break;
  case 'other':
    do d;
    break;
  case 'more':
    do e;
    break;
  // ...and so on...
}

仅在switch中具有其他不同分支的两个基本相似的分支的异常情况下才有意义。

在正常情况下,Joe Enos有正确的方法:将逻辑分解为小的可重用位(函数调用开销is a non-issue)。做分支中的小位。