为什么Switch语句只能使用true关键字?

时间:2017-09-23 10:17:22

标签: javascript switch-statement

任何人都可以向我解释为什么第一个不工作而第二个工作?

第一声明

function test(n) {
    switch (n) {
    case (n == 0 || n == 1):
        console.log("Number is either 0 or 1");
        break;
    case (n >= 2):
        console.log("Number is greater than 1")
        break;
    default:
        console.log("Default");
    }
}

第二声明

function test(n) {
    switch (true) {
    case (n == 0 || n == 1):
        console.log("Number is either 0 or 1");
        break;
    case (n >= 2):
        console.log("Number is greater than 1")
        break;
    default:
        console.log("Default");
    }
}

3 个答案:

答案 0 :(得分:2)

将使用===比较给交换机的参数。在您拥有的情况下,您的表达式会导致boolean类型:n==0 || n==1n >= 2。当您传递一个数字时,它会尝试将您的数字与案例中表达式给出的结果进行比较。例如,对于给定的数字1,它会尝试比较1 === (1 == 0 || 1 == 1) - > 1 === true返回false(严格比较)。因此,您每次都会收到Default文字。

对于第一种情况,您需要在切换的cases中包含数字,而不是booleann==0 || n==1结果为boolean)。

对于第二种情况,您具有true类型的切换值boolean。当您再次传递1时,比较就像true === (1 == 0 || 1 == 1) - > true === true并返回true。因此,您可以根据您的值n获得所需的结果。但第二种情况没有使用true作为值的目标。您可以使用if else if语句替换它。

如果您想在许多情况下获得相同的结果,则需要将2个案例写在彼此之上。见这个

case 0:
case 1:
  result

此处的案例类型为number,而不是boolean

代码示例。

function test(n){
    switch (n) {
    case 0:
    case 1:
    console.log("Number is either 0 or 1");
    break;
    case 2:
    console.log("Number is 2")
    break;
    default:
    console.log("Default");}
}

test(0);
test(1);
test(2)

答案 1 :(得分:0)

switch使用严格比较。

你在switch语句中得到一个数字,在这种情况下,只是得到一个返回布尔值的比较。

  

switch语句首先计算其表达式。然后它查找第一个case子句,其表达式的计算结果与输入表达式的结果相同(使用strict comparison===)并将控制转移到该子句,执行关联声明。 (如果多个案例与提供的值匹配,则选择匹配的第一个案例,即使案例彼此不相等。)如果未找到匹配的case子句,程序将查找可选的{{1如果找到,则将控制转移到该子句,执行关联的语句。如果未找到default子句,则程序将在default结束后的语句处继续执行。按照惯例,switch子句是最后一个子句,但不一定如此。

答案 2 :(得分:0)

switch是一堆if的缩写。

switch(n) {
    case x:
        a();
        break;
    case y:
        b();    
        break;
}

......相当于:

if(n == x) {
     a();
} else if(n == y) {
     b();
}

所以你的第一段代码:

switch (n) {
   case (n==0 || n==1):
      console.log("Number is either 0 or 1");
      break;
case (n>=2):
     console.log("Number is greater than 1")
     break;
default:
    console.log("Default");}
}

......相当于:

if(n == (n==0 || n==1)) {
   console.log("Number is either 0 or 1");
} else if ( n == ( n >= 2)) {
   console.log("Number is greater than 1");
} else {
   console.log("Default");
}

我希望你能看到n == (n==0 || n==1)n == ( n >= 2)都是胡说八道。例如,如果n为0,则第一个将评估为0 == true。在许多语言中,这将导致编译器错误(比较不同的类型)。我不是特别想要考虑它在Javascript中的作用!

你的第二个例子:

switch (true) {
case (n==0 || n==1):
   console.log("Number is either 0 or 1");
   break;
case (n>=2):
   console.log("Number is greater than 1")
   break;
default:
   console.log("Default");
}

相当于:

if(true == (n==0 || n==1)) {
    console.log("Number is either 0 or 1");
} else if(true == (n>=2)) {
    console.log("Number is greater than 1");
} else {
    console.log("Default");
}

...至少条件陈述true == (n==0 || n==1)true == (n >=2)有意义。

但这是在大多数语言中使用switch的非传统方式。正常形式是使用您正在测试的值作为switch的参数,并将每个case作为它的可能值:

switch(n) {
    case 0:
    case 1:
         console.log("n is 0 or 1");
         break;
    case 2:
         console.log("n is 2);
         break;
    default:
         console.log("n is some other value");
}

然而,switch并不提供比完全相等检查更聪明的case。所以没有case >2 && <5

你可以使用switch(true)使用你的技巧(在Javascript中 - 有许多语言无效),或使用if / else