Страницы

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

четверг, 4 октября 2018 г.

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

console.log( null == null, undefined == undefined, NaN == NaN ); // true, true, false Почему?


Ответ

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

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

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