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

}

3 个回答

  • 旧至新
  • 新至旧
  • 最高Like数

1

idoncys

iT邦研究生 1 级 ‧ 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 参数来获取特定月份的最后一天。


  • 1

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);
}
        

  • 5

看更多先前的...收起先前的...

noway

iT邦研究生 1 级 ‧
2024-10-09 16:44:41

您好:
yyyy = null , mm = null
会出现错误

?? 语法错误

修改

ky0000

iT邦新手 5 级 ‧
2024-10-09 17:55:25

这不是 javascript 吗

修改

㊣浩瀚星空㊣

iT邦大神 1 级 ‧
2024-10-15 17:28:22

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

修改

ky0000

iT邦新手 5 级 ‧
2024-10-16 12:39:22

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing

修改

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 ),因为第二个宣告的函式跟第一个同名,所以覆盖掉了第一个函式,把函式看着变数想就很好懂了