You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:24:00