如何阻止日期数组元素自动更新?工作日计算异常修复
问题原因与解决方案
问题根源
你遇到的问题是Date对象的引用特性导致的:
- Date是引用类型,循环中你反复复用同一个
tempDate对象,每次往weekdaysList里push的都是这个对象的引用。 - 你的
addDaystoGivenDate方法里,date.setUTCDate()会直接修改传入的Date对象本身,后续每次调用该方法时,tempDate指向的对象时间被修改,数组里的所有引用都会同步变化,最终数组里全是最后一次修改后的日期。
两种解决办法
方法1:修改addDaystoGivenDate,返回全新的Date对象
调整这个方法,先创建原日期的副本,再修改副本的日期,避免修改传入的原对象:
private addDaystoGivenDate(date: Date, numberOfDays: number): Date { // 先复制原日期,再操作副本 const newDate = new Date(date); newDate.setUTCDate(newDate.getUTCDate() + numberOfDays); return newDate; }
这样每次调用该方法都会返回独立的新Date对象,循环里的tempDate每次都是新实例,push到数组里的引用不会被后续操作影响。
方法2:在push数组时创建日期副本
如果不想修改addDaystoGivenDate,可以在往数组存日期时手动创建副本:
if (this.isWeekDay(tempDate)) { weekdaysList.push(new Date(tempDate)); // 存入副本而非原对象引用 }
这样数组里的每个元素都是独立的Date实例,后续修改tempDate不会改变数组里已存的日期。
验证效果
修改后,weekdaysList里的每个工作日日期都会是独立对象,不会再出现自动递增的情况,返回结果符合预期。
内容的提问来源于stack exchange,提问作者TheLoneWolf91193
相关产品推荐
相关产品推荐

