NaN - неявный новый экземпляр (особый вид ошибки времени выполнения). Это означает NaN !== NaN
по той же причине, что new Error !== new Error
;
И помните, что такой имплициент также встречается вне ошибок, например, в контексте регулярных выражений это означает /a/ !== /a/
, который является просто синтаксическим сахаром для new RegExp('a') !== new RegExp('a')