TypeScript循环push数组时所有元素日期全部相同问题求解
问题根因
JavaScript/TypeScript中的Date属于引用类型,你代码中所有ScheduleSummaryDay实例的date属性都指向了同一个Date对象的内存地址。每次循环执行date.setDate(date.getDate() + 1)时,修改的是同一块内存空间中的值,所以之前已经push进数组的所有对象的date属性都会同步变更。你在循环内打印时刚好是在修改日期之前输出,所以看起来符合预期,循环执行7次结束后,该Date对象最终值为2021-09-20,自然所有对象的日期都显示为这个值。
修复方案
每次给day.date赋值时,单独创建新的Date实例,切断引用关联即可,同时注意不要直接修改原有的起始日期对象,避免污染全局的起始日期数据,修复后的代码如下:
createEmptySchedule(): void { // 基于原起始日期创建新的Date实例,避免修改原始数据 let currentDate = new Date(this.schedule.dates.startDate); for (let i = 0; i < 7; i++) { const day = new ScheduleSummaryDay(); // 赋值时创建新的Date实例,每个对象的日期独立存储 day.date = new Date(currentDate); day.totalEmployees = 0; day.totalInOffice = 0; day.totalRemote = 0; day.totalNotWorking = 0; this.array.push(day); currentDate.setDate(currentDate.getDate() + 1); } }
额外注意事项
- 引用类型的赋值默认是传址而非传值,除了
Date之外,Object、Array等类型也存在相同的特性,修改时需要注意是否会影响其他关联的变量 - 如果有需要深度拷贝复杂对象的场景,要根据场景选择合适的拷贝方案,避免出现类似的引用共用问题
内容的提问来源于stack exchange,提问作者TreyBCollier
相关产品推荐
相关产品推荐

