Проверка того, является ли значение числом в Javascript с помощью isNaN()

Проверка того, является ли значение числом в Javascript с помощью isNaN()

8 февраля 2023 г.

В Javascript у нас есть множество способов проверить, является ли что-то числом или нет. Это особенно распространенная задача в Javascript, где есть динамическая типизация, в результате чего некоторые неожиданные вещи классифицируются как числа. Typescript устраняет некоторые из этих проблем, но в этом руководстве мы расскажем, как проверить, это число в Javascript, а также о ловушках, которых следует избегать при попытке сделать это.

Знакомство с isNaN

NaN — это специальное значение в Javascript, которое означает «не число». Если вы попытаетесь проанализировать текстовую строку в Javascript как int, вы получите NaN: n

let x = parseInt("hello") // Returns NaN

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

5 === NaN // false
NaN === NaN // false
"foo" === NaN // false

Вы можете подумать, что все это имеет смысл, пока не попытаетесь запустить typeof NaN, который возвращает число. Итак, получается, что NaN имеет тип 'number' в Javascript, в конце концов: n

typeof NaN // 'number'

Игнорируя эти особенности, Javascript поставляется со встроенной функцией для проверки того, является ли что-то "не числом", известной как isNaN. Эту функцию можно легко использовать, чтобы определить, будет ли что-то оцениваться как NaN, если оно будет запущено через что-то вроде parseFloat: n

isNaN("hello") // true
isNaN(5) // false
isNaN({}) // true
isNaN(() => {}) // true

Поскольку isNaN проверяет, не является ли что-то числом, мы можем использовать !isNaN, чтобы проверить, является ли что-то числом. Например, !isNaN(5) — это простой способ проверить, является ли 5 числом: n

!isNaN(5)

isNaN имеет смысл в большинстве случаев, но, поскольку он анализирует числа, может вызвать некоторые неожиданные побочные эффекты. Например, Number(1n) для типов BigInt выдает ошибку и, следовательно, также выдает ошибку для isNaN: n

isNaN(1n) // true

Чтобы решить некоторые из этих проблем, Javascript создал новый метод с именем Number.isNaN. В основном это то же самое, только тип не преобразуется в число.

Число.isNaN и isNaN

Обычно считается, что они одинаковы, но isNaN и Number.isNaN работают по-разному. isNaN по существу анализирует ввод и пытается сделать из него число. Вот почему вы видите проблемы, когда пытаетесь выполнить isNaN(1n), так как Number(1n) выдает ошибку. Вместо этого вы можете использовать Number.isNaN()

Разница между isNaN и Number.isNaN заключается в том, что Number.isNaN не пытается преобразовать ввод в число. В отличие от isNaN, он просто принимает ввод и подтверждает, равен ли он NaN или нет. Это делает

Поэтому все следующие выражения вернут false, поскольку ни одно из них не равно точно NaN: n

Number.isNaN({}) // false
Number.isNaN("hello") // false
Number.isNaN(() => {}) // false
Number.isNaN("5") // false

в то время как следующее вернет true, так как они возвращают NaN: n

Number.isNaN(5 / "5") // true
Number.isNaN(parseFloat("hello")) // true

Либо Number.isNaN, либо isNaN решит большинство ваших потребностей в проверке чисел, но есть еще один способ проверить, является ли что-то числом в Javascript

Использование isInteger и isSafeInteger для проверки числа в Javascript

Также, как isNaN и Number.isNaN, глобальные методы isInteger и isSafeInteger могут помочь вам определить если что-то является просто целым числом без десятичных точек. Как и Number.isNaN, оба этих метода не пытаются оценить содержимое как число. Это означает, что передача строки всегда будет возвращать false, в то время как нормальное целое число пройдет проверку: n

isInteger("5") // false
isInteger(5) // true
isSafeInteger("5") // false
isSafeInteger(5) // true

isSafeInteger отличается от isInteger проверкой того, что число выходит за пределы диапазона bigint, то есть находится в пределах -2^53 и 2^53, поэтому в большинстве случаев isInteger подойдет.

Использование typeof для проверки того, является ли что-то числом в Javascript

Последний способ проверить, является ли что-то числом, — это использовать typeof. Опять же, в некоторых случаях это может лучше соответствовать вашим потребностям, поскольку typeof Math.sqrt(-1)< /code> возвращает число, а не NaN, однако такие вещи, как 1n, по-прежнему будут отображать тип bigint: п

typeof Math.sqrt(-1) // 'number'
typeof parseFloat("35") // 'number'
typeof 35 // 'number'
typeof 1n // 'bigint'

Однако будьте осторожны, так как это довольно ненадежно. Так как typeof NaN возвращает число, вы можете столкнуться с некоторыми неожиданными ситуациями, которых обычно следует избегать. Таким образом, Number.isNaN остается, вероятно, лучшим способом проверить, является ли что-то числом или нет.

Вот несколько неожиданных ситуаций typeof, которых вам следует избегать: n

typeof parseFloat("hello") // 'number' - since NaN is a number
typeof 5 / "5" // 'NaN' - since this evaluates typeof 5, and then divides by "5"
typeof (5 / "5") // 'number' - since this evaluates as NaN, which is a number
typeof NaN // 'number' - since NaN is of type number
typeof "5" // 'string'

Заключение

Проверка того, является ли что-то числом или нет, в Javascript имеет некоторые сложности, но в целом это просто. Ключевые моменты:

    Обычно используется
  • isNaN, но его ввод будет оцениваться как число, что может привести к тому, что некоторые входные данные будут ошибочно оценены как NaN или возникнет ошибка.
  • Number.isNaN — это надежная версия isNaN, которая проверяет, точно ли что-то равно NaN. Он не оценивает свое содержимое как число
  • typeof может сказать вам, является ли что-то числом или нет, но это может привести к некоторым неожиданным ситуациям, поскольку NaN также введите номер.

Надеюсь, вам понравилось это руководство по проверке того, является ли что-то числом в Javascript. Вы также можете ознакомиться с другими моими материалами по Javascript здесь.


Также опубликовано здесь


Оригинал