Что такое NaN в JavaScript? Каков его тип? Как можно надежно проверить, равно ли значение NaN?

В JavaScript NaN является свойством глобального Object. Другими словами, это переменная, доступная в глобальной области видимости.

Она расшифровывается как Not-A-Number, но интересно, что ее тип — number.

console.log(typeOf NaN); // "number"
Вход в полноэкранный режим Выйти из полноэкранного режима

Используется для обозначения объекта, который не является или не вычисляется в number, в контексте, когда к этому объекту применяются операции number.

Еще один интересный факт о NaN заключается в том, что оно никогда не равно самому себе. Поэтому NaN == NaN или NaN === NaN всегда false.

console.log(NaN == NaN); // false
console.log(NaN === NaN); // false

Вход в полноэкранный режим Выход из полноэкранного режима

Проверка на NaN

Поскольку NaN никогда не равен другому NaN, самосравнение значения является самым надежным способом проверки, является ли значение NaN.

function isThisNaN(value) { return value !== value };

isThisNaN(1); // false
isThisNaN(NaN); // true
isThisNaN(Number.NaN); // true
isThisNaN('NaN'); // false
Вход в полноэкранный режим Выход из полноэкранного режима

Другие способы проверить, является ли объект NaN, — использование глобального метода isNaN() и Number.isNaN().

console.log(isNaN('hi')); //true
console.log(isNaN('4'); // false
Вход в полноэкранный режим Выход из полноэкранного режима

В двух приведенных выше примерах isNaN() ожидает коэрцитивности типа для строки, прежде чем выполнить сравнение. В первом случае с 'hi', string приводится к number, который затем оценивается как NaN, потому что он не возвращает число. Во втором случае с '4', он получает оценку number, поэтому не является NaN. Поэтому использование isNaN() не очень надежно для проверки на NaN.

В отличие от этого, Number.isNaN() проверяет текущее значение:

console.log(Number.isNaN('hi')); // false
console.log(Number.isNaN('4')); // false (this time because 
                                // it's a string in the
                                // context of a Number method)
Вход в полноэкранный режим Выход из полноэкранного режима

В Number.isNaN() отсутствует принуждение к типу. Вместо этого строка сравнивается напрямую. В приведенном выше коде 'hi' и '4' являются строками и поэтому не являются NaN в контексте метода Number. Это делает Number.isNaN() более надежным, чем isNaN() при проверке на значения NaN.


Ссылки

  1. NaN
  2. Как можно надежно проверить, равно ли значение NaN?

Оцените статью
devanswers.ru
Добавить комментарий