JavaScript中使用switch(true)判断数字范围不生效是什么原因?
问题解答
原代码逻辑错误的原因
你写的0 < timeNow <= 12在JavaScript中会按照左结合的规则分步执行:
- 先计算
0 < timeNow,得到布尔类型的结果true或false - 再将布尔值隐式转换为数字(
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
相关产品推荐
相关产品推荐

