Проверка: isFinite и isNaN
Помните эти специальные числовые значения?
Infinity
(и-Infinity
) — особенное численное значение, которое ведёт себя в точности как математическая бесконечность ∞.NaN
представляет ошибку.
Эти числовые значения принадлежат типу number
, но они не являются «обычными» числами, поэтому есть функции для их проверки:
isNaN(value)
преобразует значение в число и проверяет является ли оноNaN
:alert( isNaN(NaN) ); // true alert( isNaN("str") ); // true
Нужна ли нам эта функция? Разве не можем ли мы просто сравнить=== NaN
? К сожалению, нет. ЗначениеNaN
уникально тем, что оно не является равным ни чему другому, даже самому себе:alert( NaN === NaN ); // false
isFinite(value)
преобразует аргумент в число и возвращаетtrue
, если оно является обычным числом, т.е. неNaN/Infinity/-Infinity
:alert( isFinite("15") ); // true alert( isFinite("str") ); // false, потому что специальное значение: NaN alert( isFinite(Infinity) ); // false, потому что специальное значение: Infinity
Иногда isFinite
используется для проверки, содержится ли в строке число:
let num = +prompt("Enter a number", '');
// вернёт true всегда, кроме ситуаций, когда аргумент - Infinity/-Infinity или не число
alert( isFinite(num) );
Помните, что пустая строка интерпретируется как 0
во всех числовых функциях, включаяisFinite
.Сравнение Object.is
Существует специальный метод Object.is, который сравнивает значения примерно как ===
, но более надёжен в двух особых ситуациях:
- Работает с
NaN
:Object.is(NaN, NaN) === true
, здесь он хорош. - Значения
0
и-0
разные:Object.is(0, -0) === false
, это редко используется, но технически эти значения разные.
Во всех других случаях Object.is(a, b)
идентичен a === b
.
Этот способ сравнения часто используется в спецификации JavaScript. Когда внутреннему алгоритму необходимо сравнить 2 значения на предмет точного совпадения, он использует Object.is
(Определение SameValue).
parseInt и parseFloat
Для явного преобразования к числу можно использовать +
или Number()
. Если строка не является в точности числом, то результат будет NaN
:
alert( +"100px" ); // NaN
Единственное исключение — это пробелы в начале строки и в конце, они игнорируются.
В реальной жизни мы часто сталкиваемся со значениями у которых есть единица измерения, например "100px"
или "12pt"
в CSS. Также во множестве стран символ валюты записывается после номинала "19€"
. Так как нам получить числовое значение из таких строк?
Для этого есть parseInt
и parseFloat
.
Они «читают» число из строки. Если в процессе чтения возникает ошибка, они возвращают полученное до ошибки число. Функция parseInt
возвращает целое число, а parseFloat
возвращает число с плавающей точкой:
alert( parseInt('100px') ); // 100
alert( parseFloat('12.5em') ); // 12.5
alert( parseInt('12.3') ); // 12, вернётся только целая часть
alert( parseFloat('12.3.4') ); // 12.3, произойдёт остановка чтения на второй точке
Функции parseInt/parseFloat
вернут NaN
, если не смогли прочитать ни одну цифру:
alert( parseInt('a123') ); // NaN, на первом символе происходит остановка чтения
Второй аргумент parseInt(str, radix)
Функция parseInt()
имеет необязательный второй параметр. Он определяет систему счисления, таким образом parseInt
может также читать строки с шестнадцатеричными числами, двоичными числами и т.д.:
alert( parseInt('0xff', 16) ); // 255
alert( parseInt('ff', 16) ); // 255, без 0x тоже работает
alert( parseInt('2n9c', 36) ); // 123456
Другие математические функции
В JavaScript встроен объект Math, который содержит различные математические функции и константы.
Несколько примеров:Math.random()
Возвращает псевдослучайное число в диапазоне от 0 (включительно) до 1 (но не включая 1)
alert( Math.random() ); // 0.1234567894322
alert( Math.random() ); // 0.5435252343232
alert( Math.random() ); // ... (любое количество псевдослучайных чисел)
Math.max(a, b, c...)
/ Math.min(a, b, c...)
Возвращает наибольшее/наименьшее число из перечисленных аргументов.
alert( Math.max(3, 5, -10, 0, 1) ); // 5
alert( Math.min(1, 2) ); // 1
Math.pow(n, power)
Возвращает число n
, возведённое в степень power
alert( Math.pow(2, 10) ); // 2 в степени 10 = 1024
В объекте Math
есть множество функций и констант, включая тригонометрические функции, подробнее можно ознакомиться в документации по объекту Math.
Итого
Чтобы писать числа с большим количеством нулей:
- Используйте краткую форму записи чисел –
"e"
, с указанным количеством нулей. Например:123e6
это123
с 6-ю нулями123000000
. - Отрицательное число после
"e"
приводит к делению числа на 1 с указанным количеством нулей. Например:123e-6
это0.000123
(123
миллионных).
Для других систем счисления:
- Можно записывать числа сразу в шестнадцатеричной (
0x
), восьмеричной (0o
) и бинарной (0b
) системах счисления parseInt(str, base)
преобразует строку в целое число в соответствии с указанной системой счисления:2 ≤ base ≤ 36
.num.toString(base)
представляет число в строковом виде в указанной системе счисленияbase
.
Для преобразования значений типа 12pt
и 100px
в число:
- Используйте
parseInt/parseFloat
для «мягкого» преобразования строки в число, данные функции по порядку считывают число из строки до тех пор пока не возникнет ошибка.
Для дробей:
- Используйте округления
Math.floor
,Math.ceil
,Math.trunc
,Math.round
илиnum.toFixed(precision)
. - Помните, что при работе с дробями происходит потеря точности.
Ещё больше математических функций:
- Документация по объекту Math. Библиотека маленькая, но содержит всё самое важное.