JavaScript生成日期数组异常:结果均为结束日期后一天
问题分析与解决方案
问题根源
你这段代码的核心问题是Date对象属于引用类型:循环中currentDate始终指向同一个Date实例,每次调用setDate()只是修改这个实例的日期值,而数组里push的都是这个实例的引用。当循环结束时,这个Date实例已经被修改为2022-04-07,所以数组里的两个元素最终都指向这个最终值。
修复方案
只需要在push的时候,为当前日期创建一个独立的副本,避免后续修改影响已存入数组的元素。以下是两种简单的实现方式:
方式1:push时创建新的Date副本
修改res.push(currentDate)为res.push(new Date(currentDate)),同时循环初始化时复制一份startDate,避免修改原始的startDate变量:
let startDate = new Date("2022-04-05"); // starting date let endDate = new Date("2022-04-06"); // ending date let result = await cycleThroughDays(startDate, endDate); console.log("result", result) async function cycleThroughDays(startDate, endDate) { let res = []; // 初始化时复制startDate,避免修改原始变量 for (let currentDate = new Date(startDate); currentDate <= endDate; currentDate.setDate(currentDate.getDate() + 1)) { console.log(currentDate) // 创建当前日期的副本存入数组 res.push(new Date(currentDate)); } console.log(res) return res; }
方式2:调整循环执行顺序
先push当前日期,再修改日期值,用while循环更直观地控制执行逻辑:
let startDate = new Date("2022-04-05"); // starting date let endDate = new Date("2022-04-06"); // ending date let result = await cycleThroughDays(startDate, endDate); console.log("result", result) async function cycleThroughDays(startDate, endDate) { let res = []; let currentDate = new Date(startDate); while (currentDate <= endDate) { console.log(currentDate) res.push(new Date(currentDate)); currentDate.setDate(currentDate.getDate() + 1); } console.log(res) return res; }
效果验证
修改后执行代码,输出会符合预期:
2022-04-05T00:00:00.000Z 2022-04-06T00:00:00.000Z [ 2022-04-05T00:00:00.000Z, 2022-04-06T00:00:00.000Z ] result [ 2022-04-05T00:00:00.000Z, 2022-04-06T00:00:00.000Z ]
内容的提问来源于stack exchange,提问作者JEFF
相关产品推荐
相关产品推荐

