Мне интересно, почему 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, чтобы быть последовательным.