Javascript 测试交换机中的多个情况,如OR(| |)
当您需要在相同情况下测试a或b时,您将如何使用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
开关
案例
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()
,然后您将看到四个警报,因为它在多个情况下出现,其中一些警报下有警报。IssomeVar
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");
}