Проверка того, является ли значение числом в 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 code> и
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 здесь.
Также опубликовано здесь
Оригинал