测试开关中的多种情况,例如OR(||)


Answers:


563

您可以使用穿透:

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

69
称为掉线
Felix Kling

2
我在发布问题之前就发现了这个问题,但是认为它对社区有用,因为在任何地方都没有很好的文档记录...谢谢@SLaks,您的回答也是如此。
安德烈斯(Andres)

嗨,@ kei,我知道这不是合适的地方,但是您正确回答了我的最后一个问题stackoverflow.com/questions/21049005/…您想重新发布答案吗?
Leon Gaban 2014年

1
我还想澄清一点:一旦案例评估为真,就是这样。不再检查所有情况,仅执行所有语句直至结束:即“ break;”。指令或开关是否终止。
BeauCielBleu 2014年


118

由于其他答案在没有实际解释其工作原理的情况下说明了如何进行操作:

switch执行时,它找到第一个匹配case语句,然后在切换之后执行的代码的每一行,直至它碰到或者是break语句或的端部switch(或一个return语句留下含整个函数)。当您故意省略时break,下一个下面的代码也将case被执行,这称为fall-through。因此,对于OP的要求:

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

   case "details-page":
      alert("goodbye");
      break;
} 

忘记包含break语句是一个很常见的编码错误,并且如果您switch没有按照预期的方式工作,这是您应该寻找的第一件事。因此,有些人喜欢在注释中说“ fall through”,以明确表示故意中断了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;
}

您还可以(可选)包含一个default案例,如果其他所有案例都不匹配,则将执行该案例-如果您不包含default且案例不匹配,则什么也不会发生。您可以(可选)使用默认情况。

因此,在我的第二个示例中,如果someVar为1,它将调用someFunction(),然后您将看到四个警报,因为它遇到了多个情况,其中有些情况下还包含警报。是someVar3、4或5,您会看到两个警报。如果someVar为7,则会看到“其他”,如果为8或任何其他值,则会看到“结束”。


4
// fall through注释使我的phpstorm停止警告我有关fall-through switch语句的信息,谢谢:)
Getz

如果开关在调用的函数中返回某个对象,则可以使用return而不是break:switch(action.type){case ADD:{return newState; } case DELETE:{return newState; }默认值:{返回状态;}
多米尼卡

14

您需要制作两个case标签。

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


9

您必须切换它!

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

1
这种方法非常创新:-)为此我很喜欢。但是,由于它使用的字符比经典的“掉落式”字符更多,因此变得不那么有趣了:)
AlexLaforge

1
@AlexLaforge最奇怪和具有讽刺意味的是,在另一个stackouverflow问题中,这样的答案被完全否决了。但是,尽管如此,我支持这个答案并同意,对于灵活的条件,这是一个很好的解决方案。
AlexNikonov

3

忘记switchbreak,让玩家用if。而不是断言

if(pageid === "listing-page" || pageid === "home-page")

让我们用案例创建几个数组,并使用Array.prototype.includes()检查它

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

-6

使用逗号分隔大小写

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.