问答中心分类: JAVASCRIPTJavaScript中用于多种情况的Switch语句
0
匿名用户 提问 1月 前

在JavaScript中的switch语句中需要多个case,例如:

switch (varName)
{
   case "afshin", "saeed", "larry":
       alert('Hey');
       break;

   default:
       alert('Default case');
       break;
}

我该怎么做?如果在JavaScript中没有这样的方法,我想知道一个同样遵循DRY概念.

19 Answers
0
rob welan 回答 1月 前

这适用于常规JavaScript:

function theTest(val) {
  var answer = "";
  switch( val ) {
    case 1: case 2: case 3:
      answer = "Low";
      break;
    case 4: case 5: case 6:
      answer = "Mid";
      break;
    case 7: case 8: case 9:
      answer = "High";
      break;
    default:
      answer = "Massive or Tiny?";
  }
  return answer;
}

theTest(9);
mihail malostanidis 回复 1月 前

@相信在Santa中,它实际上只是正常情况,格式奇怪(空格而不是换行符)

kasun hasanga 回复 1月 前

您还可以使用case(1 || 2 || 3):而不是case 1:case 2:case 3:

atmiya kolsawala 回复 1月 前

案例1:案例2:案例3:为我工作,谢谢,但@kasun你的解决方案不起作用。

george. 回复 1月 前

仅供参考,我在TS中尝试了@Kasun的方法,但它对我不起作用(我知道OP想要JS中的解决方案)

simon alling 回复 1月 前

@Kasanhasanga建议的解决方案不起作用的原因是case (1||2||3):相当于case 1:(自1||2||3评估结果为1).

0
elclanrs 回答 1月 前

这里有不同的方法来避免switch总声明:

var cases = {
  afshin: function() { alert('hey'); },
  _default: function() { alert('default'); }
};
cases.larry = cases.saeed = cases.afshin;

cases[ varName ] ? cases[ varName ]() : cases._default();
eric elliott 回复 1月 前

我当然更喜欢这个版本。故障是switch ... case. 忘记一件事太容易了break声明,如果你故意使用fall-throup,那些被遗忘的break陈述可能很难识别。此方法查找版本还具有许多强大的功能switch ... case缺乏动态扩展性或完全替换对象以完成模式切换的能力。它还可以更容易地保持干净的组织,并可以产生更易于维护的代码。看见埃里克领先。com/2012/12/switch案例被认为有害

mnebuerquo 回复 1月 前

我总是添加评论//fallthrough代替break每当我故意省略break. 这有助于识别什么时候是错误,什么时候是故意的。

contactmatt 回复 1月 前

直观的方法。然而,为了可读性,我建议使用本机switch语句。

clint eastwood 回复 1月 前

人们总是可以用右手从脖子后面抓左耳。。。(对不起我的英语,我的意思是:“人们总是可以尽可能地把事情复杂化……在这种情况下,避免使用switch语句来支持这种复杂的解决方案似乎不是正确的做法……)

elclanrs 回复 1月 前

不,switch在我的书中是反模式的。这一点都不复杂,相反,这是一种常见的替代方法,显然对可维护性和重构更好,因为现在可以移动案例,因为您得到的是表达式,而不是语句。

jefferey cave 回复 1月 前

@克林特·伊斯特伍德我同意,除了我经常喜欢把要采取的行动抽象出来。如果我包装了一堆处理程序供其他人使用,最好给他们一堆带标签的函数:他们根本不需要查看函数,只需根据标签应用正确的函数。

michael 回复 1月 前

我真的很惊讶,这竟然获得了34张选票。就可读性和可维护性而言,这绝对是可怕的。如果我想看看什么条件会触发某些事情,那么案例陈述非常简单,通过查看标签就可以很容易地看到。另一方面,你的版本需要有人阅读几乎每一行,看看你在哪里分配了什么。如果你想匹配更多的案例,情况会变得更糟。

wizzwizz4 回复 1月 前

@michael这是很久以前在MDN链接的一个问题上发布的。当然,它有投票权-/

martin dawson 回复 1月 前

如果你这样做的唯一原因是害怕转换语句,那么这就太可怕了。如果我读了这篇文章才发现它和开关是一样的,我会很生气。亲吻

karl gjertsen 回复 1月 前

这是一个可怕的函数。初级开发人员应该如何快速查看并理解它?是的,switch语句占用更多空间,但更容易调试和维护。

erike 回复 1月 前

(cases[varName] || cases._default)():

0
er. anurag jain 回答 1月 前

在Javascript中,要在一个开关中分配多个案例,我们必须定义different case without break inbetween如下所示:

<script>
      function checkHere(varName){
        switch (varName)
           {
           case "saeed":
           case "larry":
           case "afshin":
                alert('Hey');
                break;
          case "ss":
               alert('ss');
               break;
         default:
               alert('Default case');
               break;
       }
      }
     </script>

请参见示例单击链接

dralbert 回复 1月 前

这是许多语言中的常见技术,不受JS的约束

0
kyle dudley 回答 1月 前

我喜欢这个是为了清晰和干燥语法。

varName = "larry";

switch (true)
{
    case ["afshin", "saeed", "larry"].includes(varName) :
       alert('Hey');
       break;

    default:
       alert('Default case');

}
0
erike 回答 1月 前

如果您使用的是ES6,您可以这样做:

if (['afshin', 'saeed', 'larry'].includes(varName)) {
   alert('Hey');
} else {
   alert('Default case');
}

或者对于早期版本的JavaScript,您可以这样做:

if (['afshin', 'saeed', 'larry'].indexOf(varName) !== -1) {
   alert('Hey');
} else {
   alert('Default case');
}

请注意includes在某些浏览器(包括旧的IE版本)中不起作用,但你可以相当容易地修补这些问题。看到问题了吗确定字符串是否在javascript的列表中了解更多信息。

bryce snyder 回复 1月 前

这比转换有什么好处?

erike 回复 1月 前

@BryceSnyder表达式和语句之间的区别是什么?少打字?减少垂直线消耗?通过简洁和密集的表达来提高表达能力?通过includes单词你挑吧。

vindom 回复 1月 前

对我来说,好处是,我可以从外部配置源使用数组,在外部更改数组后,代码仍然可以工作。

jeremy 回复 1月 前

这是我的首选选项,这些case选项块看起来很疯狂,包括可以使用原始数组而不是单独提取元素。

andrew knackstedt 回复 1月 前

这是一个非常可靠的选项,唯一的缺点是它不如switch语句可读。