如何简洁实现日期减指定月份功能,避免重复代码?
解决Date对象减月份时修改原实例的问题
问题核心:JavaScript的Date是引用类型,原函数直接调用setMonth会原地修改传入的日期对象,导致原实例被篡改。以下是几种简洁的优化实现,既避免修改原对象,又直接返回符合RFC 3399标准的结果(toISOString()输出完全符合该格式)。
简洁实现方式1:函数内复制实例后操作
export function subtractMonths(numOfMonths: number, date: Date = new Date()) { // 复制传入的日期对象,避免修改原实例 const targetDate = new Date(date); targetDate.setMonth(targetDate.getMonth() - numOfMonths); // 直接返回RFC 3399格式字符串 return targetDate.toISOString(); }
简洁实现方式2:箭头函数一行写法
如果偏好更紧凑的代码,可以写成一行:
export const subtractMonths = (numOfMonths: number, date: Date = new Date()) => new Date(new Date(date).setMonth(date.getMonth() - numOfMonths)).toISOString();
调用验证
const currDate = new Date(); // 示例值:"2022-08-24T18:26:33.965Z" const endDate = subtractMonths(6, currDate); // 返回:"2022-02-24T18:26:33.965Z" console.log(currDate.toISOString()); // 原日期保持不变:"2022-08-24T18:26:33.965Z"
原代码问题说明
原函数中date.setMonth()是原地修改操作,会直接改变传入的currDate实例。同时函数返回的date和传入的currDate指向同一个对象,所以后续formattedStartDate和formattedEndDate会得到相同结果,这就是不符合预期的原因。
内容的提问来源于stack exchange,提问作者Spacecase
相关产品推荐
相关产品推荐

