iT邦幫忙

0

JS OVERLOAD 問題請教

  • 分享至 

  • xImage

您好:
如下程式碼,
為何 我呼叫 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);

}
        
souden iT邦新手 5 級 ‧ 2024-10-09 16:05:11 檢舉
good
froce iT邦大師 1 級 ‧ 2024-10-09 19:51:08 檢舉
JS沒有,其實應該說JS根本沒檢查函數參數。
var test = (a)=>{}

你直接test(),JS也不會報錯,所以要類似重載直接檢查參數有沒有存在比較快。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
idoncys
iT邦研究生 2 級 ‧ 2024-10-09 16:02:22
最佳解答

貼到 chatgpt 會回答如下,不知道是否為你要的答案


在你的代码中,函数 str_YYYYMM31 被定义了两次:一次是无参数的,另一次是带有 yyyymm 参数的。由于 JavaScript 的函数重载是基于最后定义的函数,调用 str_YYYYMM31() 时会使用带参数的版本。

因此,当你调用 str_YYYYMM31() 时,实际上是调用了带参数的函数,但没有提供参数,这导致函数在执行时出错。

要解决这个问题,有两种方法:

  1. 重命名函数:给其中一个函数一个不同的名字,避免重名。例如,可以将带参数的函数重命名为 str_YYYYMM31_param

    function str_YYYYMM31_param( yyyy, mm ) { /*月底; 傳入西元年,月 數值 */
        let d31 = new Date(yyyy, mm, 0);
        return date2SateStr(d31);
    }
    
  2. 合并函数:你可以将两个函数合并为一个,通过检查参数的数量来决定如何处理。

    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() 获取当前月份的最后一天,或者传递 yyyymm 参数来获取特定月份的最后一天。

noway iT邦研究生 1 級 ‧ 2024-10-09 16:52:36 檢舉

謝謝您!

0
ky0000
iT邦新手 5 級 ‧ 2024-10-09 16:05:52

在 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);
}
        
看更多先前的回應...收起先前的回應...
noway iT邦研究生 1 級 ‧ 2024-10-09 16:44:41 檢舉

您好:
yyyy = null , mm = null
會出現錯誤

?? 語法錯誤

ky0000 iT邦新手 5 級 ‧ 2024-10-09 17:55:25 檢舉

這不是 javascript 嗎

javascript 沒有 ?? 的使用方法啦!!
PHP用太久了喔

ky0000 iT邦新手 5 級 ‧ 2024-10-16 12:39:22 檢舉
froce iT邦大師 1 級 ‧ 2024-10-17 09:03:26 檢舉

https://ics.media/entry/200128/

ES2020加進去的。

3
harry xie
iT邦研究生 1 級 ‧ 2024-10-09 16:08:59

不建議這樣寫,你如果要用 overload 這個特性建議用 TypeScript

為什麼執行 str_YYYYMM31( yyyy,mm ),因為第二個宣告的函式跟第一個同名,所以覆蓋掉了第一個函式,把函式看著變數想就很好懂了

我要發表回答

立即登入回答