NaN в JavaScript может быть чем угодно. На самом деле, это может быть что угодно, если это не число. Технически его тип — «число» (при оценке с помощью «typeof»), хотя оно означает Не число.

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

Значения могут стать NaN различными способами, которые обычно связаны с ошибочными математическими вычислениями (такими как 0/0) или в результате приведения типов, неявного или явного. Типичным примером является запуск parseInt для строки, начинающейся с буквенного символа. Это относится не только к parseInt, но также применяется при использовании явного приведения с помощью Number() или с унарным оператором «+».

Как вы проверяете NaN?

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

NaN — странное значение в JavaScript, так как оно не равно самому себе при сравнении ни с оператором свободного равенства (==), ни с оператором строгого равенства (===). NaN — единственное значение во всем языке, которое ведет себя таким образом в отношении сравнений.

Например, если parseInt("a") возвращает NaN, то parseInt("a") === NaN вернет false. Это может показаться странным, но это имеет смысл, если подумать о том, что такое NaN на самом деле.

NaN не говорит вам, чем что-то является, оно говорит вам, чем оно не является.

Эти две разные строки, переданные в функцию parseInt(), обе вернут NaN.

Оба оператора возвращают NaN, но действительно они одинаковы? Возможно, но, безусловно, имеет смысл, почему JavaScript не согласен, учитывая, что они получены из разных строковых аргументов.

Вот несколько примеров строгого сравнения неравенств, демонстрирующих несостоятельность NaN.

Способ 1: isNaN или Number.isNaN

В JavaScript есть встроенный метод с соответствующим названием isNaN, который проверяет наличие NaN. Существует более новая функция под названием Number.isNaN, включенная в спецификацию ES2015.

Разница между isNaN и Number.isNaN заключается в том, что isNaN приводит аргумент к числовому типу. Чтобы избежать сложных и неожиданных результатов, часто рекомендуется использовать более новый и надежный Number.isNaN, чтобы избежать этих побочных эффектов. Number.isNaN не выполняет никакого принудительного преобразования типа, поэтому он просто возвращает логическое значение на основе параметра.

Вот пример разницы между двумя методами:

isNaN при передаче undefined возвращает true, потому что undefined становится NaN после приведения числа. Вы можете проверить это самостоятельно, запустив Number(undefined). Вы обнаружите, что он возвращает NaN.

Number.isNaN, с другой стороны, возвращает false. Это связано с тем, что никакого принуждения не происходит, а undefined — это не NaN, это просто undefined.

Также важно отметить, что Number.isNaN — это более новый (ES2015) метод в JavaScript, поэтому браузерная поддержка Number.isNaN не так стабильна, как isNaN, который существует с ES1 (1997).

Метод 2: Object.is

Object.is — это метод JavaScript, который проверяет сходство. Обычно он выполняет те же вычисления, что и оператор строгого равенства (===), хотя обрабатывает NaN иначе, чем строгое равенство.

Object.is(0, -0) вернет false, а 0 === -0 вернет true. Сравнения 0 и -0 различаются, как и сравнения NaN. Эта концепция называется «равенство равного значения и нуля».

Object.is(NaN, NaN) на самом деле вернет true, тогда как мы уже знаем, что NaN === NaN возвращает false. Это делает это еще одним допустимым способом проверить, не является ли что-то числом.

Заключение

Среди приведенных методов проверки NaN наиболее распространенным является использование глобальной функции isNaN или метода ES2015 Number.isNaN. Хотя метод № 2 действителен, большинство людей обычно используют isNaN или Number.isNaN, которые были созданы специально для проверки NaN.

Первоначально опубликовано на https://www.loginradius.com.