Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Почему NaN не равняется NaN?

#nodejs #javascript


console.log( null == null, undefined == undefined, NaN == NaN ); // true, true, false

Почему?    


Ответы

Ответ 1



Попробуем взглянуть на проблему с точки зрения математики. Как известно, NaN - это типичный результат для действий вроде деления бесконечности на бесконечность или ноля на ноль и прочих операций, результат которых с математической точки зрения не определен или не имеет смысла. Например, из математики известно, что логарифм отрицательного числа не определен. То есть следующая операция будет иметь результат NaN: Math.log(-5) // NaN При этом если вы попробуете выполнить такую операцию: 0/0 то ее результатом тоже будет NaN. В таком случае напрашивается вывод, что Math.log(-5) и 0/0 равны (в обоих случаях мы получим NaN). Очевидно, что это не так. Поэтому Принято допущение, что NaN не равен даже самому себе. (более того, будь NaN равен самому себе, то помощью нехитрых преобразований можно было бы прийти к выводу, что 2 == 1) Иными словами, NaN - это не какое-то конкретное значение, а просто некая достаточно удобная абстракция, под которой могут скрываться самые разные значения, совершенно не равные друг другу. У этого парадокса есть любопытное следствие: функцию IsNAN легко реализовать таким образом: return arg !== arg;

Ответ 2



Mozilla пишут про NaN так: Описание NaN – это свойство глобального объекта. Начальное значение NaN это Not-A-Number — то же, что у Number.NaN. В современных браузерах NaN это неизменяемое, только для чтения свойство. Даже в случаях когда это не так, не переопределяйте его. Использование NaN в программах довольно редко. Это значение возвращается в случаях, когда не удаётся вычислить ф-ии объекта Math (Math.sqrt(-1)) или терпит неудачу преобразование строки в число (parseInt("blabla")). Сравнение с NaN Операторы равенства (== и ===) нельзя использовать для сравнения значения с NaN. Вместо этого используйте метод Number.isNaN() или isNaN(). NaN === NaN; // false Number.NaN === NaN; // false isNaN(NaN); // true isNaN(Number.NaN); // true

Ответ 3



Сейчас в php проверил и в as3 ( выбор пал из-за наличия онлайн компиляторов под рукой ) и там NaN равен NaN Да ну :) уверен что он там равняется ? if (NAN == NAN) { echo 'true'; } else { echo 'false'; } или даже так var_dump(NAN == NAN); // boolean false В любом ЯП NAN == NAN => false

Комментариев нет:

Отправить комментарий