这就是我现在所拥有的,
switch (true) {
case moveOneType === "rock" || moveOneType === "paper" || moveOneType === "scissors":
case moveTwoType === "rock" || moveTwoType === "paper" || moveTwoType === "scissors":
case moveThreeType === "rock" || moveThreeType === "paper" || moveThreeType === "scissors":
break;
是否会切换接受多个表达式,还是可以在案例值中使用||
和&&
?
如果没有,我只会使用if/else
代替
答案 0 :(得分:3)
您的代码很好,尽管它可能不是switch
的最常见用法。
它的工作原理是评估case
语句中的表达式并使用结果,因此case
语句的表达式评估为true
将匹配{ {1}}。
这是一个简单的例子
switch(true)
您可以看到它输出function getValue() {
console.log('get value');
return 2;
}
switch (true) {
case getValue() === 1 || getValue() === 2:
console.log('ok');
break;
case false:
console.log('not ok');
break;
default:
break;
}
两次,一个用于第一个get value
,另一个用于第二个(即getValue()
之后)。结果计算为||
,因为true
返回2.正如我们使用getValue() === 2
一样,只要case语句中的表达式返回switch(true)
,{{1}将执行语句,因此在此示例中,将输出true
。
现在,我不确定你的case
声明应该首先做什么,所以我不能告诉你这是否是一个处理你的问题的好方法,但它不是表示使用返回布尔值的表达式并将其与ok
匹配不正确。
答案 1 :(得分:1)
您必须使用if/else
。
您的switch
语句可以是表达式。但是案例条件是您从switch
语句的输出中得到的可能值的值。这是Documentation
var moveOneType;
if(moveOneType === "rock" || moveOneType === "paper" || moveOneType === "scissors"){}
else if(moveTwoType === "rock" || moveTwoType === "paper" || moveTwoType === "scissors"){}
else if(moveThreeType === "rock" || moveThreeType === "paper" || moveThreeType === "scissors"){}
答案 2 :(得分:1)
我完全不知道你要做什么,但我会尝试解释你的代码。这是你的代码:
switch (true) {
case moveOneType === "rock" || moveOneType === "paper" || moveOneType === "scissors":
case moveTwoType === "rock" || moveTwoType === "paper" || moveTwoType === "scissors":
case moveThreeType === "rock" || moveThreeType === "paper" || moveThreeType === "scissors":
break;
<强>解释强>
所有会发生的事情是表达式将被评估,在这种情况下,表达式是true
中的switch
,而true
是true
,执行将会进行如果提供的任何案例与true
匹配,则进入该块。否则执行将不会进入块。
这是一个测试。请注意我已将数字1添加到变量值的末尾,因此没有一个案例检查为true:
var moveOneType = "rock1";
var moveTwoType = "paper1";
var moveThreeType = "scissors1";
switch(true)
{
case moveOneType === "rock" || moveOneType === "paper" || moveOneType === "scissors":
alert('case 1');
case moveTwoType === "rock" || moveTwoType === "paper" || moveTwoType === "scissors":
alert('case 2');
case moveThreeType === "rock" || moveThreeType === "paper" || moveThreeType === "scissors":
alert('case 3');
break;
}
现在很清楚执行是如何进入块的,这是另一个测试,它将澄清为什么你的代码充满惊喜。在下面的代码中,我们将切换hello
的值,因为它等于some garbage
,执行将进入块内。为什么?因为case 'some garbage'
的计算结果为true。所以猜测一下:由于案例之间没有break
,每个案例都会被评估,你会看到4个警报。
var moveOneType = "rock";
var moveTwoType = "paper";
var moveThreeType = "scissors";
var hello = 'some garbage';
switch(hello)
{
case 'some garbage': alert('garbage');
case moveOneType === "rock" || moveOneType === "paper" || moveOneType === "scissors":
alert('case 1');
case moveTwoType === "rock" || moveTwoType === "paper" || moveTwoType === "scissors":
alert('case 2');
case moveThreeType === "rock" || moveThreeType === "paper" || moveThreeType === "scissors":
alert('case 3');
break;
}
如果您不希望评估所有案例,请在案例后添加一个中断。
切换接受多个表达式
确实如下所示。将评估表达式moveOneType === "rock" && moveTwoType === "paper"
,值为true
,如果至少有一个案例也是true
,则执行将进入块内:
var moveOneType = "rock";
var moveTwoType = "paper";
var moveThreeType = "scissors";
switch(moveOneType === "rock" && moveTwoType === "paper")
{
case moveOneType === "rock" || moveOneType === "paper" || moveOneType === "scissors":
alert('case 1');
case moveTwoType === "rock" || moveTwoType === "paper" || moveTwoType === "scissors":
alert('case 2');
case moveThreeType === "rock" || moveThreeType === "paper" || moveThreeType === "scissors":
alert('case 3');
break;
}