Codewars季度判断函数报错原因咨询——根据月份数字判断季度
问题描述
我正在Codewars平台进行编程挑战,挑战要求:给定一个1到12的月份整数,返回其对应的季度整数。例如:月份2(February)属于第一季度;月份6(June)属于第二季度;月份11(November)属于第四季度。
我尝试了以下代码:
const quarterOf = (month) => { // Your code here if (month <= 3) { return 1 } else if (6 >= month > 3) { return 2 } else if (9 >= month > 6) { return 3 } else if (12 >= month > 9) { return 4 } }
这段代码无法正常运行,我知道可以给每个月份赋值,但我想提升编程技能,有人能解释这段代码失效的原因吗?
代码失效原因解析
问题出在你写的链式比较表达式上,比如6 >= month > 3这种写法在JavaScript里的执行逻辑和你预期的完全不同。
JavaScript会从左到右依次计算这类表达式:
- 先计算
6 >= month,得到一个布尔值(true或false) - 接着用这个布尔值和
3比较,也就是执行true > 3或者false > 3 - 在JS中,布尔值会被自动转换为数字:
true对应1,false对应0。所以不管month取什么值,1 > 3和0 > 3的结果都是false
这直接导致第二个else if分支永远不会被触发,同理后面的9 >= month > 6、12 >= month > 9分支也全部失效。最终只有第一个分支能正常返回结果,其他月份的输入都会走到函数末尾,返回undefined。
修正方案
把链式比较拆成两个用&&(逻辑与)连接的独立条件即可:
const quarterOf = (month) => { if (month <= 3) { return 1 } else if (month > 3 && month <= 6) { return 2 } else if (month > 6 && month <= 9) { return 3 } else if (month > 9 && month <= 12) { return 4 } }
进阶简洁写法
如果想进一步优化代码,可以利用数学逻辑简化:
const quarterOf = (month) => Math.ceil(month / 3);
原理很简单:1-3除以3得到0.333到1,向上取整后是1;4-6得到1.333到2,向上取整后是2;以此类推,完全匹配季度的划分规则,代码也更简洁。
内容的提问来源于stack exchange,提问作者bradys dev
相关产品推荐
相关产品推荐

