您好:
如下程式碼,
為何 我呼叫 str_YYYYMM31()
但她卻跑去 str_YYYYMM31( yyyy,mm ),結果就錯了
謝謝
function hrdate_e_df(){
/*
let d = new Date();
let d31= new Date(d.getFullYear(), d.getMonth() + 1, 0);
let xx = date2SateStr(d31);
*/
let y=str_YYYYMM31();
return y;
}//--hrdate_e_df
function str_YYYYMM31() { /*月底*/
let d = new Date();
let d31= new Date(d.getFullYear(), d.getMonth() + 1, 0);
//document.write(d01);
return date2SateStr(d31);
}
function str_YYYYMM31( yyyy,mm ) { /*月底; 傳入西元年,月 數值 */
let d31= new Date(yyyy, mm , 0); //---這邊直接用MM,不需要MM+1
//document.write(d01);
return date2SateStr(d31);
}
貼到 chatgpt 會回答如下,不知道是否為你要的答案
在你的代码中,函数 str_YYYYMM31
被定义了两次:一次是无参数的,另一次是带有 yyyy
和 mm
参数的。由于 JavaScript 的函数重载是基于最后定义的函数,调用 str_YYYYMM31()
时会使用带参数的版本。
因此,当你调用 str_YYYYMM31()
时,实际上是调用了带参数的函数,但没有提供参数,这导致函数在执行时出错。
要解决这个问题,有两种方法:
重命名函数:给其中一个函数一个不同的名字,避免重名。例如,可以将带参数的函数重命名为 str_YYYYMM31_param
。
function str_YYYYMM31_param( yyyy, mm ) { /*月底; 傳入西元年,月 數值 */
let d31 = new Date(yyyy, mm, 0);
return date2SateStr(d31);
}
合并函数:你可以将两个函数合并为一个,通过检查参数的数量来决定如何处理。
function str_YYYYMM31(yyyy, mm) {
let d31;
if (arguments.length === 0) {
let d = new Date();
d31 = new Date(d.getFullYear(), d.getMonth() + 1, 0);
} else {
d31 = new Date(yyyy, mm, 0);
}
return date2SateStr(d31);
}
这样,你可以在不传递参数时使用 str_YYYYMM31()
获取当前月份的最后一天,或者传递 yyyy
和 mm
参数来获取特定月份的最后一天。
在 js 中應該沒有這種 overload 寫法
可以寫成
function str_YYYYMM31( yyyy = null , mm = null ) {
const d = new Date();
const d31 = new Date(yyyy ?? d.getFullYear(), mm ?? d.getMonth() + 1, 0);
return date2SateStr(d31);
}
不建議這樣寫,你如果要用 overload 這個特性建議用 TypeScript
為什麼執行 str_YYYYMM31( yyyy,mm ),因為第二個宣告的函式跟第一個同名,所以覆蓋掉了第一個函式,把函式看著變數想就很好懂了