Javascript 测试交换机中的多个情况,如OR(| |)

Javascript 测试交换机中的多个情况,如OR(| |),javascript,switch-statement,fall-through,Javascript,Switch Statement,Fall Through,当您需要在相同情况下测试a或b时,您将如何使用开关案例 switch (pageid) { case "listing-page" || "home-page": alert("hello"); break; case "details-page": alert("goodbye"); break; } 您可以使用fall-through: switch (pageid) { case "listing-page": case "home

当您需要在相同情况下测试ab时,您将如何使用
开关
案例

switch (pageid) {
  case "listing-page" || "home-page":
    alert("hello");
    break;
  case "details-page":
    alert("goodbye");
    break;
}

您可以使用fall-through:

switch (pageid)
{
    case "listing-page":
    case "home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}

您需要制作两个
case
标签


控件将从第一个标签到第二个标签,因此它们都将执行相同的代码。

因为其他答案解释了如何执行,而没有实际解释其工作原理:

当执行
开关
时,它会找到第一个匹配的
case
语句,然后执行开关后的每一行代码,直到它碰到
break
语句或
开关
的结尾(或
return
语句以保留整个包含函数)。当您故意省略
中断
以便下一个
案例
下的代码也被执行时,这被称为失败。因此,对于OP的要求:

switch (pageid) {
   case "listing-page":
   case "home-page":
      alert("hello");
      break;

   case "details-page":
      alert("goodbye");
      break;
} 
忘记包含
break
语句是一个相当常见的编码错误,如果
开关的工作方式不符合您的预期,则应首先查找该错误。出于这个原因,一些人喜欢在评论中说“失败”,以明确何时故意省略中断语句。我在下面的示例中这样做,因为它有点复杂,并显示了某些情况下如何在失败之前包含要执行的代码:

switch (someVar) {
   case 1:
      someFunction();
      alert("It was 1");
      // fall through
   case 2:
      alert("The 2 case");
      // fall through
   case 3:
      // fall through
   case 4:
      // fall through
   case 5:
      alert("The 5 case");
      // fall through
   case 6:
      alert("The 6 case");
      break;

   case 7:
      alert("Something else");
      break;

   case 8:
      // fall through
   default:
      alert("The end");
      break;
}
您还可以(可选)包括
默认
案例,如果其他案例都不匹配,则将执行该案例-如果您不包括
默认
且没有案例匹配,则不会发生任何事情。您可以(可选)使用默认情况


因此,在我的第二个示例中,如果
someVar
为1,它将调用
someFunction()
,然后您将看到四个警报,因为它在多个情况下出现,其中一些警报下有警报。Is
someVar
Is 3、4或5您将看到两个警报。如果
someVar
为7,您将看到“其他内容”,如果为8或任何其他值,您将看到“结束”。

使用逗号分隔大小写

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
你得换一下

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}

忘记
开关
中断
,如果
,让我们玩
。而不是断言

if(pageid === "listing-page" || pageid === "home-page")
让我们创建几个带有案例的数组,并使用


我在发布问题之前就发现了这个问题,但我认为它对社区很有用,因为它在任何地方都没有很好的文档记录。。。谢谢@SLaks,谢谢你的回答。嗨@kei,我知道这不是合适的地方,但你正确地回答了我的最后一个问题。你想重新发布你的答案吗?我不妨澄清一下这一点:一旦一个案例评估为真,就是这样。不再检查任何情况,只检查直到结束时执行的所有语句:即“break;”指令或开关是否终止。其他示例可能重复-,这是100%您的问题;)我发现每种情况下只允许使用逗号。//fall-through注释使我的phpstorm停止警告我fall-through-switch语句,谢谢:)如果开关位于调用以返回某个对象的函数中,则可以使用return而不是break:switch(action.type){case ADD:{return newState;}case DELETE:{return newState;}默认值:{return state;}}这个方法非常创新:-)我喜欢它。但是,因为它使用的字符比经典的“fall-through”多,它变得不那么有趣:)@Alexlafge最奇怪和讽刺的是,在另一个stackouverflow问题中,这样的答案被完全否决了。但是,尽管如此,我支持这个答案,并同意,这是灵活条件下的好解决方案。它很酷,很有效!谢谢洛蒂。我认为这不是最好的解决方案,特别是在性能方面ncludes比开关盒慢得多,因此,使用if/else。最好使用带fall-through的开关盒。
var caseA = ["listing-page", "home-page"];
var caseB = ["details-page", "case04", "case05"];

if(caseA.includes(pageid)) {
    alert("hello");
}
else if (caseB.includes(pageid)) {
    alert("goodbye");
}
else {
    alert("there is no else case");
}