В 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 .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.