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

IT技术 javascript switch-statement fall-through
2021-03-05 03:42:01

switch case当您需要在同一情况下测试a b时,您将如何使用 a

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

您可以使用跌倒:

switch (pageid)
{
    case "listing-page":
    case "home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
我不妨澄清一点:一旦一个案例评估为真,就是这样。不再检查更多的情况,只检查所有语句直到结束:即“break;” 指令或切换是否终止。
2021-04-16 03:42:01
这叫做落空
2021-04-19 03:42:01
我在发布问题之前就发现了这一点,但我认为这对社区很有用,因为它在任何地方都没有得到很好的记录......谢谢@SLaks 也为你提供了答案。
2021-04-22 03:42:01
嗨@kei 我知道这不是合适的地方,但你正确回答了我的最后一个问题stackoverflow.com/questions/21049005/...你想重新发布你的答案吗?
2021-05-05 03:42:01
MDN 文档中的其他示例
2021-05-15 03:42:01

由于其他答案解释了如何做到这一点,而没有真正解释它的工作原理:

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

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

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

忘记包含break语句是一个相当常见的编码错误,如果您switch没有按照预期的方式工作,这是您应该寻找的第一件事出于这个原因,有些人喜欢在注释中说“失败”,以明确何时故意省略了 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案例,如果其他案例都不匹配,则将执行该案例 - 如果您不包含 adefault并且没有案例匹配,则不会发生任何事情。您可以(可选)使用默认情况。

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

如果 switch 位于您调用以返回某个对象的函数中,您可以使用return而不是break: switch (action.type) { case ADD: { return newState; } case DELETE: { return newState; } 默认值:{ 返回状态;} }
2021-04-21 03:42:01
//fall through 注释使我的 phpstorm 停止警告我关于 fall-through switch 语句,谢谢:)
2021-04-30 03:42:01

您需要制作两个case标签。

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

你必须切换它!

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}
这种方法非常创新:-) 我喜欢它。但是,由于它使用的字符比经典的“fall-through”多,所以它变得不那么有趣了:)
2021-04-20 03:42:01
@AlexLaforge 最奇怪和讽刺的是,在另一个 stackouverflow 问题中,这样的答案完全被否决了。但尽管如此,我支持这个答案并同意,这是灵活条件的好解决方案。
2021-05-12 03:42:01

忘记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");
}
我认为这不是最好的解决方案,特别是对于性能。.includes 比 switch case 慢得多,因此,使用 if/else。最好使用带有防坠落装置的开关盒。
2021-04-28 03:42:01