切换语句和类型强制

时间:2016-06-23 15:29:22

标签: javascript

我在网络开发人员的专业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")。 规则改变了还是我做错了什么?

5 个答案:

答案 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;将truetrue语句顶部的switch进行比较。由于truetrue完全相同,因此控制流进入case

答案 4 :(得分:1)

不是javascript的专家,但我认为作者提到的规则在这种情况下有效,例如:

   var num = "9";

    switch(num){

        case 9:
            alert("Yes the number is equal to: 9");
            break;
        default:
            alert("False");

    }

如果您尝试运行此代码,您将看到第二个警报将会出现。

希望我帮助你.. :)