В 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
.
Ссылки
- NaN
- Как можно надежно проверить, равно ли значение NaN?