JavaScript切换与逻辑运算符?

时间:2010-02-22 17:39:59

标签: javascript switch-statement

for (var count = 1; count < 6; count++) {
    switch (count) {
        case (2):   document.write("hi"); break;     
        case (count > 3):   document.write("bye"); break;    
        case (count >= 4): document.write("lol"); break;
    }
}

因为它没有按照我期望的方式工作,而不是打印再见和lol,这让我觉得这在JavaScript中是无效的。我试着寻找一些例子来看看人们是否在Google上这样做,我没有看到。这是否有效?或者为什么这不起作用?

5 个答案:

答案 0 :(得分:86)

解释switch时,括号中的表达式将与特定情况的值进行比较。

因此,在您的情况下,count的值将与2count > 3count >= 4的值进行比较。那是行不通的。虽然您可以重写它并与true进行比较以使其正常工作:

switch (true) {
    case (count == 2):
        document.write("hi");
        break;
    case (count > 3):
        document.write("bye");
        break;
    case (count >= 4):
        document.write("lol");
        break;
}

但这并不是switch应该如何使用。

改为使用if语句:

if (count == 2) {
    document.write("hi");
} else if (count > 3) {
    document.write("bye");
} else if (count >= 4) {
    document.write("lol");
}

修改由于您独占使用switch个案例(如果个案匹配则中断),我的switch - 至 - if / else翻译是正确的。

count >= 4 case / branch永远不会应用,因为count > 3对于大于或等于4的count值为真(也是)。

要修复此问题(对于大于或等于4的值,请写“bye”“lol”),删除最后一个else以使最后if个语句独立来自前面的:

if (count == 2) {
    document.write("hi");
} else if (count > 3) {
    document.write("bye");
}
if (count >= 4) {
    document.write("lol");
}

答案 1 :(得分:5)

这是对Gumbo's answer的更正。我正在写一个单独的答案,因为这不适合作为评论。

编辑: Gumbo在评论中建议我可能误读了Doug的意图。如果OP真的希望打印出“bye”和“lol”以计数&gt; = 4,那么我们需要从break中删除switch。这些案件现在又恢复原状,因此“bye”和“lol”按此顺序打印(这显然是OP的意图。)

switch (true) {
    case (count == 2):
        document.write("hi");
        break;
    case (count > 3):
        document.write("bye");
        // No break here; just fall through.
    case (count >= 4):
        document.write("lol");
        break;
}

在这种情况下,我同意Gumbo修改后的if声明是正确的。

原始答案如下(假设OP确实希望 “或lol”或“bye”进行打印,但不能同时打印。)

switch语句Gumbo wrote不适用于count&gt; = 4,原因与Gumbo的原始if语句不起作用的原因相同:因为案例是按顺序评估,count> = 4意味着将执行第二种情况(计数> 3);所以脚本永远不会达到计数&gt; = 4.要解决这个问题,测试应该以相反的顺序执行,从最高到最低:

switch (true) {
    case (count >= 4):
        document.write("lol");
        break;
    case (count > 3):
        document.write("bye");
        break;
    case (count == 2):
        document.write("hi");
        break;
}

更正后的if语句仍然不正确,因为对于count&gt; = 4,它会在输出上产生 byelol。同样,if阶梯内的测试应该安排从最高值到最低值:

if (count >= 4) {
    document.write("lol");
} else if (count > 3) {
    document.write("bye"); 
} else if (count == 2) {
    document.write("hi");
}

这不是一个理想的示例,因为如果count是整数,那么评估count >= 4count > 3会产生相同的结果 - true用于计数&gt ; = 4,false否则。如果count是一个浮点值,那就不是这种情况(但是,一个名为“count”的浮点值会引起其他问题。)

答案 2 :(得分:2)

您以错误的方式使用case子句。您应该提供一个值,该值将与switch子句中的值进行比较...而不是像这样的布尔表达式count>2

在这种情况下,这个布尔表达式将被强制转换为true或false(1或0)并与您的值计数进行比较,有时可能有效 - 有时 - 不是。

您应该考虑将其替换为if语句。

答案 3 :(得分:0)

您应该更换最后两个案例。

答案 4 :(得分:0)

switch通常需要固定条件/值;因为你的count变量每次都会改变,所以它与此相反。改为使用if-else条件。