Почему undefined == undefined, но NaN!= NaN?

Мне интересно, почему undefined == undefined, но NaN != NaN.

Ответ 1

Так как это определено как в Алгоритм сравнения абстрактного равенства, так и Строгий алгоритм сравнения равенства.

Если любой из операндов в == или === равен NaN, он возвращает false.

Абстрактный

  • Если Type (x) - Number, то
    • Если x является NaN, верните false.
    • Если y является NaN, верните false.
    • Если x - это то же значение числа, что и y, верните true.
    • Если x равно +0 и y равно -0, верните true.
    • Если x равно -0 и y равно +0, верните true.
    • Возвращает false.

EDIT: Мотивация для неравного сравнения, отмеченная @CMS, соответствует стандарту IEEE 754.

Из ссылки в Википедии, приведенной в комментарии ниже:

... Однако обычные операции сравнения обрабатывают NaN как неупорядоченные и сравнивают -0 и +0 как равные. Предикат totalOrder будет упорядочивать эти случаи, а также различает различные представления NaN и между тем же десятичным числом с плавающей запятой, закодированным по-разному.

Ответ 2

Потому что Math.sqrt(-5) !== Math.sqrt(-6).

Ответ 3

Не уверен, почему это так, но чтобы проверить, является ли определенный оператор или переменная NaN, вы должны использовать isNaN метод

Ответ 4

Я бы предположил, что стандарт IEEE допускает более одного представления NaN. Не все NaN равны друг другу...

Ответ 5

Причиной является то, что создатели хотели, чтобы x == x возвращал false, чтобы означать, что x является NaN, поэтому NaN == NaN возвращает false, чтобы быть последовательным.