Firefox中JavaScript获取月内首个周一的while循环运行过慢求助
解决Firefox中获取每月首个周一的性能问题
嘿,我太懂你的困扰了!Firefox对日期循环的处理确实比Chrome敏感不少,那种逐天递增的while循环在某些边界场景下很容易卡甚至崩溃——虽说最多也就跑6次,但Firefox的日期引擎好像对这种连续修改Date对象的操作优化得不太好。
其实根本不用循环,用数学计算偏移量的方法就能直接算出当月第一个周一,高效又稳,所有浏览器都能秒出结果:
// 假设你已经有了目标年份和月份(注意:月份是0-based,比如1月对应0) const targetYear = 2024; const targetMonth = 8; // 代表9月 // 先初始化到当月第一天 const firstMonday = new Date(targetYear, targetMonth, 1); // 直接计算需要偏移的天数,一步跳到第一个周一 const dayOffset = (1 - firstMonday.getDay() + 7) % 7; firstMonday.setDate(firstMonday.getDate() + dayOffset); console.log(firstMonday); // 输出当月第一个周一的完整日期
简单解释下逻辑:
getDay()返回0(周日)到6(周六)的数字(1 - firstMonday.getDay() + 7)是为了确保结果始终为正数(避免出现负数偏移的情况)- 取模7保证偏移量在0到6之间:
- 如果当月第一天就是周一,偏移量为0,直接用当天
- 如果是周日,偏移量为1,加1天就到周一
- 如果是周二到周六,偏移量会精准算出距离下一个周一的天数(比如周六的话,偏移量是2,加2天正好到周一)
这种方法完全避开了循环,一次计算就能得到结果,不管在Chrome还是Firefox里都不会有性能问题,更不会崩溃。
内容的提问来源于stack exchange,提问作者Chayma Atallah
相关产品推荐
相关产品推荐

