开关盒不起作用

时间:2013-07-05 07:38:47

标签: javascript switch-statement

我的问题是我想滚动到指定的div (#morg,#vorm,#nachm,#abe),它总是转到默认语句。

为什么?

function scrollToCarret(listview) {
var hour = new Date();
var hours = hour.getHours();

console.log(listview + hours);
switch(hours) {
    case hours < "8":
        console.log("< 8");
      break;
    case hours < "13":
        console.log("< 13");
      break;
    case hours < "18":
        console.log("< 18");
      break;
    case hours < "24":
        console.log("< 24");
      break;
    default:
        console.log("faiL");
    }
}

由于

3 个答案:

答案 0 :(得分:2)

JavaScript中的

switch / case不能像那样工作。它总是测试每个case的相等性。

它的作用是将条件(hours < "18"等)转换为布尔值,因为它需要每个case的标量值。然后将hours的值与case s中的每个值进行比较。由于找不到匹配的(因为它们是truefalse),因此它会跳转到default

基本上运行的是以下内容:

if (hours == (hours < "8") {
  ...
} else if (hours == (hours < "13") {
  ...
} else if (hours == (hours < "18") {
  ...
} else if (hours == (hours < "24") {
  ...
}

将每个case与您在switch中提供的表达式进行比较,在本例中为hours

是的,我有时也非常想念VB Select Case。但是类C语言通常没有类似的东西(但PowerShell确实如此; - ))。

答案 1 :(得分:1)

除了与选择器相等之外,

Switch statements不会用于任何其他内容。

在您的代码中,选择器是每个逻辑表达式的结果。如果我们假设hours = 8:

,则以下行是相同的
case hours < 8:
case (hours < "8"):
case (8 < "8"):
case false:

答案 2 :(得分:0)

switch语句的工作原理是将第一个表达式(switch关键字后面的表达式)与case个关键字后面的表达式进行比较。

因此,在您的代码中,您基本上将hours(预期为整数)与hours < "8"(布尔值)进行比较,这会产生意外结果。

您想要做的是改变:

switch (hours) {
    case hours < "8":
        ...
    case hours < "13":
        ...
    case hours < "18":
        ...
    case hours < "24":
        ...
    default:
        ...
}

要:

if (hours < 8) {
    ...
} else if (hours < 13) {
    ...
} else if (hours < 18) {
    ...
} else if (hours < 24) {
    ...
} else {
    ...
}