引数を渡さなければ undefined となるのが基本的な動作なのに明示的に undefined を渡すときと省略したときで動きが違う関数があります
console.log(new Date())
// Thu Mar 17 2022 22:39:45 GMT+0900 (日本標準時)
console.log(new Date(undefined))
// Invalid Date
わざわざ undefined なんて渡さないと言っても 実際には変数に入ってるのが undefined なのでけっこうあります
例えば
const fn = date_str => {
const date = new Date(date_str)
// ...
}
fn("2022/01/01")
fn()
引数を渡さなければデフォルトで今の時刻であることを期待してるのに Invalid Date になるというのはよくあるミスです
これの対処のために
const fn = date_str => {
const date = date_str == null ? new Date() : new Date(date_str)
// ...
}
と書かないといけないというのは不満しかないです
... を使って配列を引数に展開できるので
const fn = date_str => {
const date = new Date(...(date_str == null ? [] : [date_str]))
// ...
}
と書いても動きますが 読みやすいとは言えません
const fn = (...a) => {
const date = new Date(...a)
// ...
}
とするとよりスッキリはしますが 引数を見て何を受け取るのかわかりづらいです
可変長引数である意味はないですし 他にも引数が必要な関数だと面倒が増えます
Date の場合はデフォルトが現在日時なので それをデフォルト引数とするという方法も取れます
const fn = (date_str = new Date().toString()) => {
const date = new Date(date_str)
// ...
}
引数を書くところがごちゃごちゃしてきます
Date コンストラクタの引数のところで書くほうがいいかもしれません
const fn = date_str => {
const date = new Date(date_str ?? new Date())
// ...
}
どっちにしても デフォルト値を別に作るために new Date() を余分に呼び出すことになってますし 気持ちの良い解決策とは言えないです
Date が undefined を渡した場合に引数無しと同じ動きとなってればこんな問題は起きないんですけどね
Date に関していえば早く Temporal が実装されて Date 型を使わなくて良くなってほしいです