在 javascript 中使用 switch(true) 来处理数字范围不起作用的情况?

Using switch(true) in javascript for case with number range not working?

我的目标是在午夜和中午 12 点之间存储带有“Good AM”的变量问候语。 如果在中午 12 点到下午 6 点之间,则为“下午好”。 如果在下午 6 点到午夜之间,则为“晚上好”。

我在底部附上了我的代码。 问题是,它总是 return greet = "Good AM" 的结果,即使它没有 morning/fall 在这种情况下指定的范围内。

我发现 case (0 < timeNow <= 12) 部分有问题 我修改了我的代码以使用 case(timeNow<=12) 替换 case (0 < timeNow <= 12) 它有效。 有谁知道为什么会这样?

p/s:我还注意到 'Unexpected mix of '<' 和 '<=' 的警告。 (no-mixed-operators)eslint' 在我的代码沙箱中。

const timeNow = new Date('8-26-2021 23:15:00').getHours();
console.log(timeNow);

switch (true) {
  case (0 < timeNow <= 12):
    greet = "Good AM";
    break;
  case timeNow <= 18:
    greet = "Good Afternoon";
    break;
  case timeNow <= 23:
    greet = "Good Evening";
    break;

  default:
    greet = "error";
}
console.log(greet);

这个条件并不代表你认为的意思:

0 < timeNow <= 12

例如,如果第一个条件解析为 true,则其余条件为:

true <= 12

这没有多大意义。表达式是 合乎逻辑的 ,而不是 直观的 。如果你想检查两个独立的东西,写两个独立的表达式并用逻辑运算符组合它们:

0 < timeNow && timeNow <= 12

就像@David 说的...这是一个带有硬编码时间的片段,用于演示目的以及第一个 case 语句中更正的比较:

const timeNow = new Date('8-26-2021 23:15:00').getHours();
console.log(timeNow);

switch (true) {
  case (timeNow <= 12):
    greet = "Good AM";
    break;
  case timeNow <= 18:
    greet = "Good Afternoon";
    break;
  case timeNow <= 23:
    greet = "Good Evening";
    break;

  default:
    greet = "error";
}
console.log(greet);