为什么dayjs的isBefore方法运行不符合预期,相同代码在momentjs中正常
问题原因
核心差异是 momentjs 和 dayjs 的对象可变性设计不同:
- momentjs 的
add方法是可变操作,调用后会直接修改原 moment 对象的值 - dayjs 的所有日期操作方法都是不可变操作,调用后只会返回新的 dayjs 实例,原实例的值不会发生任何改变
你的代码中,day 变量在 while 循环内从未被重新赋值,永远等于初始的 startDay.clone().subtract(1, 'day'),所以 day.isBefore(endDay, 'day') 判断永远为 true,进入无限循环,不断往 calendar 数组插入数据最终导致内存溢出。
同时当前的 map 逻辑在 dayjs 下也无法生成正确的一周日期:每次 day.add(1, 'day') 都基于初始的 day 计算,最终生成的7个日期都是同一天。
解决方法
调整循环逻辑,每次修改日期后主动更新 day 变量即可,修改后代码参考:
import dayjs from 'dayjs'; const calendar = []; const today = dayjs(); const startDay = today.clone().startOf('month').startOf('week'); const endDay = today.clone().endOf('month').endOf('week'); let day = startDay.clone().subtract(1, 'day'); while (day.isBefore(endDay, 'day')) { const week = [] for (let i = 0; i < 7; i++) { // 主动更新day变量为add后的新实例 day = day.add(1, 'day') week.push(day.clone()) } calendar.push(week) };
内容的提问来源于stack exchange,提问作者jifakir
相关产品推荐
相关产品推荐

