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

咨询:TypeScript/JavaScript中向Date[][]添加Date[]的异常行为原因

Date对象数组元素重复的原因解析

你用Date类型生成时间区间数组时遇到了所有元素内容一致的问题,先看你的原代码:

let todaysDate = new Date();
let startTime: Date = new Date(todaysDate.setHours(5, 0, 0));
let endTime: Date = new Date(todaysDate.setHours(6, 0, 0));
let start : number = startTime.getTime();
let interval: number = 600000;

let firstTime = new Date(startTime.getTime());
let secondTime = new Date(startTime.getTime() + interval);

let timeIntervalsArray: Date[][] = [];

while (secondTime.getTime() < endTime.getTime()) {
    firstTime.setTime(start);
    secondTime.setTime(firstTime.getTime() + interval);

    const times: Date[] = [firstTime, secondTime];
    timeIntervalsArray.push(times);
    start += interval;
}

console.log(timeIntervalsArray);

运行后数组里所有子数组的时间都和最后一次循环的结果一致,改成const times: Date[] = [new Date(firstTime), new Date(secondTime)];就解决了问题,核心原因是Date是引用类型:

  • 你在循环外创建的firstTime和secondTime是两个固定的Date对象,每次循环里调用setTime只是修改这两个对象内部存储的时间值,对象本身在内存中的引用地址没有变。
  • 每次循环把[firstTime, secondTime]push到数组里,其实是把这两个对象的引用存进了数组。数组里所有子数组指向的都是同一个firstTime和secondTime对象。
  • 当循环结束时,这两个对象的时间已经被修改到最后一次循环的状态,所以打印数组时,所有元素显示的都是最后一次修改后的时间。

而用new Date(firstTime)创建新对象时,每次循环都会生成两个全新的Date实例,每个实例都有独立的内存空间,后续循环修改原来的firstTime和secondTime不会影响这些已经存进数组的新对象,所以数组里的每个子数组都能保留对应循环的时间区间。

内容的提问来源于stack exchange,提问作者Anton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:47:20