new Date('2023-01-01') と new Date(2023, 0, 1) の違い

new Date('2023-01-01')
も new Date(2023, 0, 1)
2023/01/01 の同時刻の Date object を生成する同じ処理のように感じるが、違う。
テストコードでモック用のデータ生成時に、二つの表記の違いを意識せずテストを書いてしまい、bug を生じさせてしまったので、戒めにメモしとく。

new Date('2023-01-01')
は UTC
new Date('2023-01-01')
は UTC の 2023/01/01 00:00:00 (= 2023-01-01T00:00:00.000Z) を生成する。
日付のみの文字列(例: "1970-01-01")は UTC として扱われ、日付時刻の文字列(例: "1970-01-01T12:00")は ローカルとして扱われます。したがって、入力形式が 2 つの型の間で一貫していることを確認することも推奨されます。
常に入力が ISO 8601 形式 (YYYY-MM-DDTHH:mm:ss.sssZ) であることを確認してください。
と書かれている通り、文字列で指定する場合は、常に ISO 8601 形式 (YYYY-MM-DDTHH:mm:ss.sssZ) を使っておくのが安全。

new Date(2023, 0, 1)
は local timezone
new Date('2023-01-01')
は local timezone の 2023/01/01 00:00:00 を生成する。
Asia/Tokyo の timezone で実行した場合、ISO 表記では、2022-12-31T15:00:00.000Z の Date が生成される。
少なくとも年と月が指定された場合、この Date() の形式は Date オブジェクトを返します。その成分値(年、月、日、時、分、秒、ミリ秒)はすべて以下の引数から得られます。欠落しているフィールドには、使用可能な最小の値(day には 1、他にもすべての成分には 0 )が指定されます。引数の値はすべて、UTC ではなくローカルのタイムゾーンに対して評価されます。