JavaScript 切换逻辑运算符?

IT技术 javascript switch-statement
2021-03-16 06:43:38
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;
    }
}

因为它不像我期望的那样工作,不打印再见和大声笑,这让我觉得这在 JavaScript 中是无效的。我试着寻找一些例子,看看人们是否在谷歌上这样做,但我没有看到。那么这是有效的还是无效的?或者为什么这可能不起作用?

5个回答

switch被解释,在括号中的表达比的特定情况下的值。

因此,在您的情况下, 的值count将与2,count > 3的值进行比较count >= 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-to- if/else翻译是正确的。

但是count >= 4case/branch 永远不会被应用,因为count > 3对于count大于或等于 4 的值也是如此

要解决此问题(将“bye”“lol”写入大于或等于 4 的值),删除最后else一个if语句以使最后一个语句独立于前面的语句:

if (count == 2) {
    document.write("hi");
} else if (count > 3) {
    document.write("bye");
}
if (count >= 4) {
    document.write("lol");
}
@Doug:随意删除最后一个else
2021-05-06 06:43:38
switch 和 if 语句中的计算顺序仍然存在问题。请参阅下面我的评论:stackoverflow.com/questions/2312817/...
2021-05-10 06:43:38

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

编辑: Gumbo 在评论中建议我可能误读了 Doug 的意图。如果 OP 真的希望在 count >= 4 时打印出“bye”和“lol”,那么我们需要breakswitch. 这些案例现在恢复到原来的顺序,因此“再见”和“大声笑”按该顺序打印(这显然是 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真的想无论是“笑”或“再见”来打印,但不能同时使用。)

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

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 >= 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计数> = 4,false否则。如果count是浮点值,则情况并非如此(但是,名为“count”的浮点值会引起其他问题。)

你知道,我错过了:我们都很难在每个 case 子句中包含一个中断;我没有想到 OP希望这两种情况都执行。我将更新我的答案以涵盖该场景。
2021-04-22 06:43:38
Doug 没有给出他期望的结果的准确描述(“printing bye and lol”不是一个准确的描述)。这就是为什么我只是写了工作的switch例子,等同if-else例如这一点。
2021-04-30 06:43:38

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

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

您应该考虑用 if 语句替换它。

switch通常需要一个固定的状态/值; 因为您的count变量每次都在变化,这与此相反。改用if-else条件。

你应该交换你的最后两个案例。

@anthares:你没有抓住重点。是的,我们意识到代码按照他的方式被破坏了,但是一旦他解决了这个问题(以您和其他人概述的方式),他需要交换他的最后两个案例语句,因为永远不会输出“大声笑”它现在的样子。
2021-04-19 06:43:38
请参阅我的回答,您不能在 case 语句中放置布尔表达式……它不会按照您的预期进行评估。它将与计数变量进行比较。@ user210118 即使交换最后两种情况也会阻止按照 OP 期望的方式工作。
2021-04-22 06:43:38
@ anthares:不足以让它工作,但这是一个错误,会阻止它以他期望的方式工作。
2021-04-27 06:43:38
即使他交换然后..它仍然无法工作......我现在无法访问这种情况,但是用另一个错误代码更正错误代码的意义是什么......你的答案不是解决方案。
2021-05-01 06:43:38
@doug:> 3 将捕获应该属于 >= 4 的案例。
2021-05-17 06:43:38