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