咨询: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
相关产品推荐
相关产品推荐

