【问题标题】:How to execute multiple blocks of code with certain cases in switch statement?如何在switch语句中执行特定情况下的多个代码块?
【发布时间】:2016-07-27 17:34:13
【问题描述】:

我有一个这样的 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;
}

这个解决方案对我来说似乎有点冗长和丑陋。有没有更好的方法来实现我想要的?

【问题讨论】:

  • switch 语句已经够复杂了。你提议的是从根本上改变它们的工作方式。为什么不使用可以链接到函数的映射表呢?以{ 2: function() { ... } } 为例。
  • 嗯,我想把它保留在switch 中的主要原因是我已经在switch 语句上构建了我的项目,我不想把它全部重写成别的东西。能够做到我所描述的。
  • 你想要什么和 JavaScript 能做什么是两件不同的事情。你想屈服于现实还是用你的生命来对抗它?如果你愿意,欢迎你petition the ECMAScript group through TC39。有时我们认为最好的方法并没有成功。学习、适应、继续前进。

标签: javascript switch-statement code-structure


【解决方案1】:

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');
}

【讨论】:

  • 这种类型的执行被称为通过执行的意思——正如我理解和你所说的那样——没有break语句,开关将找到第一个真正的条件并落入开关执行的右括号每一个案件都在下降。这种类型的执行存在于 C#、C++、Java、javascript 和其他一些我确定的地方。 VB.net 是一种不符合普遍共识的语言。
  • 虽然这个答案非常接近解决问题,但它仍然不允许案例1独立执行。
【解决方案2】:

你问是否有一个更好的方法来实现你想要的......

好吧,我的解决方案是否合格取决于您对“更好”的定义,但无论如何:

你可以这样写你的 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;
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多