任何人都可以向我解释为什么第一个不工作而第二个工作?
第一声明
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");
}
}
答案 0 :(得分:2)
将使用===
比较给交换机的参数。在您拥有的情况下,您的表达式会导致boolean
类型:n==0 || n==1
或n >= 2
。当您传递一个数字时,它会尝试将您的数字与案例中表达式给出的结果进行比较。例如,对于给定的数字1
,它会尝试比较1 === (1 == 0 || 1 == 1)
- > 1 === true
返回false(严格比较)。因此,您每次都会收到Default
文字。
对于第一种情况,您需要在切换的cases
中包含数字,而不是boolean
(n==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
。