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

JavaScript中Date类型函数参数值无故变更问题求助

问题原因

JavaScript中的Date属于引用类型,而非值类型。当你把departstart作为参数传入getoffday函数时,函数内的workyday变量和外部的departstart指向的是同一个内存中的Date对象。函数里调用setHours()、setDate()这类方法时,都是直接修改这个共享的对象,所以外部的departstart自然会跟着变化。

修复方案

在函数内部创建传入Date对象的副本,操作副本而非原对象,这样就不会影响外部的变量。修改后的代码如下:

var departstart = getNextDayOfTheWeek(3, 0);
console.log("Departure from " + departstart);
var departend = getNextDayOfTheWeek(3, 0);
console.log("Departure to " + departend);
var returnstart = getoffday(3, departstart);
// 现在再检查,departstart不会变了
console.log("Departure from " + departstart);
console.log("Return from " + returnstart);
var returnend = getoffday(3, departstart);
console.log("Return to " + returnend);

// 获取指定星期几的日期
function getNextDayOfTheWeek(dayOfWeek, excludeToday = true, refDate = new Date()) {
    // 创建传入日期的副本,避免修改原对象
    const dateCopy = new Date(refDate);
    dateCopy.setHours(0, 0, 0, 0);
    dateCopy.setDate(dateCopy.getDate() + +!!excludeToday +
        (dayOfWeek + 7 - dateCopy.getDay() - +!!excludeToday) % 7);
    return dateCopy;
}

// 根据给定日期偏移指定天数
function getoffday(diff = 0, workyday = new Date()) {
    console.log("Inside function before execution " + workyday);
    // 创建传入日期的副本
    const dateCopy = new Date(workyday);
    dateCopy.setHours(0, 0, 0, 0);
    dateCopy.setDate(dateCopy.getDate() + diff);
    console.log("Inside function after execution " + dateCopy);
    return dateCopy;
}
额外说明

不仅getoffday需要修改,getNextDayOfTheWeek函数也存在同样的风险——如果调用时传入了自定义的refDate,原对象也会被修改。所以上面的代码同时修复了两个函数的引用问题,确保所有日期操作都只作用于副本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:15:33