如果switch / case能够比较多个值?

时间:2017-11-19 05:18:51

标签: javascript ecmascript-6

这就是我现在所拥有的,

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代替

3 个答案:

答案 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,而truetrue,执行将会进行如果提供的任何案例与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;
}

<== Fiddle Me ==>

现在很清楚执行是如何进入块的,这是另一个测试,它将澄清为什么你的代码充满惊喜。在下面的代码中,我们将切换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;
}

<== Fiddle Me ==>

如果您不希望评估所有案例,请在案例后添加一个中断。

  

切换接受多个表达式

确实如下所示。将评估表达式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;
}

<== Fiddle Me ==>