new Date().getUTCDay()与赋值变量值不一致问题排查
首先,我一眼就看到了导致你描述的问题的核心bug——赋值运算符代替了比较运算符,这直接解释了为什么存储的currentDay和直接调用new Date().getUTCDay()结果不一致,同时也是移动端出现NaN错误的根源。
1. 核心错误:if(currentDay = 6)是赋值而非判断
你代码里的这行:
if(currentDay = 6) { firstDay = firstDay + 7; }
这里的=是赋值运算符,不是比较运算符。这意味着不管currentDay原本的值是什么(比如周日时getUTCDay()返回0),都会被强制设置为6。这就完美解释了你遇到的现象:明明直接调用new Date().getUTCDay()返回0(周日),但存储的currentDay变量却变成了6——因为这行代码直接修改了它!
当跨周六到周日时,实际当前是周日(currentDay初始为0),但这行代码把它改成6,后续所有依赖currentDay的日期计算都会完全偏离预期,最终导致无效的日期值,进而让findDate、findMonth等函数返回NaN。
修复方法:
把赋值运算符改成严格比较运算符===(推荐,避免隐式类型转换问题):
if(currentDay === 6) { firstDay = firstDay + 7; }
2. 次要优化:避免重复创建Date实例
你当前的代码多次调用new Date()来获取不同的时间字段:
var currentDay = new Date().getUTCDay(); var currentDate = new Date().getUTCDate(); var currentHour = new Date().getUTCHours()-(new Date().getTimezoneOffset()/60); // ...其他字段
虽然大多数情况下这不会有问题,但如果代码执行时刚好跨了一秒(比如从59秒跳到0秒),不同的Date实例可能会有微小的时间差,尤其是在移动端性能波动的场景下,可能引发意外问题。建议只创建一次Date实例,然后从中获取所有需要的字段:
// 只创建一次当前时间的实例 const now = new Date(); var currentDay = now.getUTCDay(); var currentDate = now.getUTCDate(); var currentHour = now.getUTCHours() - (now.getTimezoneOffset() / 60); var currentMinute = now.getUTCMinutes(); var currentYear = now.getUTCFullYear(); // 注意:你的代码里用到了currentMonth但没定义,记得从now.getUTCMonth()获取 var currentMonth = now.getUTCMonth();
3. 验证NaN问题的根源
当currentDay被错误赋值为6后,后续计算firstDate的逻辑会出现无效值:
比如周日(实际currentDay=0)时,代码里的currentDate + firstDay - currentDay变成currentDate + 2 -6 = currentDate -4。如果当前日期是当月的前4天(比如1号),结果会是负数,这显然是无效的日期值,传入findDate后自然会返回NaN,最终导致倒计时显示NaN。
修复了第一个核心bug后,这个NaN问题也会随之解决。
内容的提问来源于stack exchange,提问作者Christian

