NaN === NaN // false
そして、算術的に不可能な操作はNaNを返します。
'BlaBlaBla'/0 // NaN
しかし、NaNには少し知られているもの(?)があります。そして、私には非常に便利なアプリケーションのようです。
TL; DR日付がすべて
一言で言えば:
new Date(NaN) // Invalid Date
便利なものは何ですか? とにかく無効な日付は日付です。 そして、すべての日付操作はまだ有効です。
タイムスタンプを直接設定する以外のDate操作はNaNを返し、Dateを無効な日付のままにします。
const x = new Date(NaN) // Invalid Date x.setTime(12345) // 12345 x.toString() // "Thu Jan 01 1970 00:00:12 GMT+0000 (+00)"
同時に、日付の有効性のチェックはどこでも簡単になります
const x = new Date(NaN) // Invalid Date isNaN(x) // true x.setTime(0) isNaN(x) // false
ここではタイムスタンプへの変換は必要ないことに注意してください。valueOf()は内部でこれを行います。
Dateを使用するすべての操作は変更可能です。 ただし、コンストラクターを使用した複製は、無効な日付でも問題なく機能します。
const x = new Date(NaN) // Invalid Date const y = new Date(x) // Invalid Date
Dateで2つの日付を直接比較することは実装されておらず、タイムスタンプを介してのみ日付を比較できます。 NaNは、無効な日付が他の日付と確実に等しくならないことを保証します。 これは非常に便利なプロパティだと思います。
const x = new Date(NaN) // Invalid Date const y = new Date(NaN) // Invalid Date x.getTime() === y.getTime() // false
残念ながら、Dateコンストラクターは入力パラメーターに関して多少奇妙な動作をします。
new Date(null) // Thu Jan 01 1970 00:00:00 GMT+0000 (+00)
nullはまったくゼロではないため、無効な日付を作成する方がはるかに論理的です。 これをJavascriptの良心に任せましょう。
ただし、コンストラクタにundefinedを強制的に渡すと、結果は期待どおりになります。 だから注意してください。
new Date(undefined) // Invalid Date
この記事はNaNについてよりもDateについてより多くのことが判明しましたが、一般的には、この特定の束についてお話ししたかったのです。