You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中使用switch(true)判断数字范围不生效是什么原因?

问题解答

原代码逻辑错误的原因

你写的0 < timeNow <= 12在JavaScript中会按照左结合的规则分步执行:

  1. 先计算0 < timeNow,得到布尔类型的结果true或false
  2. 再将布尔值隐式转换为数字(true转成1,false转成0),执行转换后的数字 <= 12
    由于1和0都满足<=12的条件,所以这个表达式永远返回true,导致第一个case始终命中,不管时间是多少都会赋值greet = "Good AM"。

替换为timeNow<=12后正常的原因

去掉0 <之后,表达式直接判断当前小时是否小于等于12,不存在连续比较的隐式转换问题,逻辑符合你预期的“0到12点返回上午问候”的需求(getHours()方法本身返回的就是0-23的整数,不会出现负数,所以省略>=0的判断在常规场景下也能运行)。如果想要代码更严谨,推荐用逻辑与&&连接两个判断条件:timeNow >= 0 && timeNow <=12。

ESLint警告的原因

你看到的no-mixed-operators警告,是ESLint检测到你在同一个表达式中混合使用了<和<=两种优先级相近的比较运算符,没有显式添加括号区分运算顺序,因此抛出提示避免你写出有逻辑歧义的代码,刚好对应了你这次遇到的连续比较错误。

优化后的完整代码

// 获取当前小时,返回值范围为0-23的整数
const timeNow = new Date('8-26-2021 23:15:00').getHours();
console.log(timeNow);
// 先声明变量,避免全局变量污染
let greet;

switch (true) {
  case (timeNow >= 0 && timeNow <= 12):
    greet = "Good AM";
    break;
  case (timeNow > 12 && timeNow <= 18):
    greet = "Good Afternoon";
    break;
  case (timeNow > 18 && timeNow <= 23):
    greet = "Good Evening";
    break;
  default:
    greet = "error";
}
console.log(greet);

内容的提问来源于stack exchange,提问作者Yu Hien Ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:21:02