В Javascript у нас есть множество способов проверить, является ли что-то числом или нет. Это особенно распространенная задача в Javascript, где есть динамическая типизация, в результате чего некоторые неожиданные вещи классифицируются как числа. Typescript исправляет некоторые из этих проблем, но в этом руководстве мы расскажем, как проверить, является ли что-то числом в Javascript, и подводных камней, которых следует избегать при попытке сделать это.
Представляем isNaN
NaN
— это специальное значение в Javascript, которое означает «не число». Если вы попытаетесь проанализировать текстовую строку в Javascript как int
, вы получите NaN:
let x = parseInt("hello") // Returns NaN
NaN
сам по себе сбивает с толку, и вы не всегда получаете ожидаемые результаты. NaN
, например, не равно никакому другому значению, в том числе самому себе. Проверка этого всегда будет возвращать false:
5 === NaN // false NaN === NaN // false "foo" === NaN // false
Вам может казаться, что все это имеет смысл, пока вы не попытаетесь запустить typeof NaN
, который вернет number
. Итак, получается, что NaN
имеет тип 'число' в Javascript, в конце концов:
typeof NaN // 'number'
Игнорируя эти особенности, Javascript поставляется со встроенной функцией для проверки того, является ли что-то «не числом», известным как isNaN
. Эту функцию можно легко использовать, чтобы определить, будет ли что-то оцениваться как NaN
, если оно будет запущено через что-то вроде parseFloat
:
isNaN("hello") // true isNaN(5) // false isNaN({}) // true isNaN(() => {}) // true
Поскольку isNaN
проверяет, не является ли что-то числом, мы можем использовать !isNaN
, чтобы проверить, является ли что-то числом. Например, !isNaN(5)
— это простой способ проверить, является ли 5
числом:
!isNaN(5)
isNaN
имеет смысл в большинстве случаев, но поскольку он анализирует числа, он может вызвать некоторые неожиданные побочные эффекты. Например, Number(1n)
для BigInt
типов выдает ошибку, и, следовательно, выдает ошибку и для isNaN
:
isNaN(1n) // true
Чтобы решить некоторые из этих проблем, Javascript только что создал новый метод, названный Number.isNaN
. Это в основном то же самое, только он не будет принуждать тип к числу.
Number.isNaN против isNaN
Обычно считается, что они одинаковы, но isNaN
и Number.isNaN
работают по-разному. isNaN
по существу анализирует ввод и пытается сделать из него число. Вот почему вы видите проблемы, когда пытаетесь выполнить isNaN(1n)
, так как Number(1n)
выдает ошибку. Вместо этого вы можете использовать Number.isNaN()
Разница между isNaN
и Number.isNaN
заключается в том, что Number.isNaN
не пытается преобразовать ввод в число. В отличие от isNaN
, он просто принимает ввод и подтверждает, равен ли он NaN
или нет. Что делает
Таким образом, все следующие действия вернут false, поскольку ни одно из них не равно точно NaN
:
Number.isNaN({}) // false Number.isNaN("hello") // false Number.isNaN(() => {}) // false Number.isNaN("5") // false
в то время как следующее вернет true, поскольку они возвращают NaN
:
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, в то время как нормальное целое число пройдет проверку:
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)
возвращает number
, а не NaN
— однако такие вещи, как 1n
, по-прежнему будут показывать тип bigint
:
typeof Math.sqrt(-1) // 'number' typeof parseFloat("35") // 'number' typeof 35 // 'number' typeof 1n // 'bigint'
Однако будьте осторожны, так как это довольно ненадежно. Так как typeof NaN
возвращает number
, вы можете столкнуться с некоторыми неожиданными ситуациями, которых обычно следует избегать. Таким образом, Number.isNaN
остается, вероятно, лучшим способом проверить, является ли что-то числом или нет.
Вот несколько неожиданных typeof
ситуаций, которых следует избегать:
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
может сказать вам, является ли что-тоnumber
или нет, но это может привести к некоторым неожиданным ситуациям, так какNaN
также относится к номеру типа.
Надеюсь, вам понравилось это руководство по проверке того, является ли что-то числом в JavaScript. Вы также можете ознакомиться с моими материалами по Javascript здесь.
Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .
Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.