我在网络开发人员的专业JavaScript中读到了#39;作者:Nicholas Zakas,第3版第78页(我认为最后一篇):
switch语句使用相同的值来比较值 运算符,因此不会发生类型强制(例如字符串" 10"是 不等于数字10)。
我编写了一些简单的switch语句来确认,结果不同:
var num = "9";
switch (true) {
case num < 0:
alert("less than 0");
break;
case num >= 0 && num <10:
alert("between 0 and 10");
break;
default:
alert("False");
}
https://jsfiddle.net/pbxyvjyf/
因此,类型强制完成:选择alert("between 0 and 10")
。
规则改变了还是我做错了什么?
答案 0 :(得分:8)
你的case语句返回一个布尔值,所以类型是正确的
num >= 0 && num <10
- 返回true或false
但如果我愿意这样做
switch (1) {
case "1":
console.log("never get here");
break;
case 1:
console.log("but this works");
break;
}
答案 1 :(得分:6)
这将返回false
:
var num = "9";
switch (num) {
case num < 0:
alert("less than 0");
break;
case num >= 0 && num <10:
alert("between 0 and 10");
break;
default:
alert("False");
}
因此,作者是正确的。
答案 2 :(得分:3)
您确实没有按预期使用switch语句。应该有一个在开关中评估的表达式,并且案例检查可能的值。这是一个典型的例子:
switch (new Date().getDay()) {
case 0:
day = "Sunday";
break;
case 1:
day = "Monday";
break;
case 2:
day = "Tuesday";
break;
case 3:
day = "Wednesday";
break;
case 4:
day = "Thursday";
break;
case 5:
day = "Friday";
break;
case 6:
day = "Saturday";
}
您使用的switch语句更像是一堆ifs。
答案 3 :(得分:3)
文档中的那一行意味着在将switch
值与每个case
值进行比较时,没有使用类型强制。
如果case
表达式本身是一个涉及类型强制的表达式,那么显然会发生类型强制。 num >= 0 && num <10
评估为true
,但引擎将使用&#34;相同的运算符&#34;将true
与true
语句顶部的switch
进行比较。由于true
与true
完全相同,因此控制流进入case
。
答案 4 :(得分:1)
不是javascript的专家,但我认为作者提到的规则在这种情况下有效,例如:
var num = "9";
switch(num){
case 9:
alert("Yes the number is equal to: 9");
break;
default:
alert("False");
}
如果您尝试运行此代码,您将看到第二个警报将会出现。
希望我帮助你.. :)