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

