Ответ 1
Когда вы используете parseFloat
или parseInt
, преобразование менее строгое. 1b5
→ 1.
Использование 1*number
или +number
для преобразования приведет к NaN
, когда ввод недействителен. Хотя в отличие от parseInt
, числа с плавающей запятой будут корректно проанализированы.
Таблица, охватывающая все возможные соответствующие параметры.
//Variables // parseInt parseFloat + 1* /1 ~~ |0 ^1 >>0 >>>0
var a = '123,',// 123 123 NaN 0 & <<0 0
b = '1.e3',// 1 1000 1000 1000 1000
c = '1.21',// 1 1.21 1.21 1 1
d = '0020',// 16 20 20 20 20
e = '0x10',// 16 0 16 16 16
f = '3e9', // 3 3000000000 <-- -1294967296 3000000000
g = '3e10',// 3 30000000000 <-- -64771072 4230196224
h = 3e25 ,// 3 3e+25 3e+25 0 0
i = '3e25',// 3 3e+25 3e+25 0 0
j = 'a123',// NaN NaN NaN 0 0
k = ' 1 ',// 1 1 1 1 1
l = ' ',// NaN NaN 0 0 0
m = '.1 ',// NaN 0.1 0.1 1 1
n = '1. ',// 1 1 1 1 1
o = '1e999',// 1 Infinity Infinity 0 0
p = '1e-999',// 1 0 0 0 0
q = false ,// NaN NaN 0 0 0
r = void 0,// NaN NaN NaN 0 0
_ = function(){return 1;}, /* Function _ used below */
s={valueOf:_},//NaN NaN 1 1 1
t={toString:_};// 1 1 1 1 1
// Intervals: (-1e+20, +1e20) (-∞,+∞) (-∞,+∞) (-2³¹,+2³¹) [0, 2³²)
// In FF9 and Chrome 17, Infinity === Math.pow(2, 1024), approx. 1.7976e+308
// In FF9 and Chrome 17, bitwise operators always return 0 after about ±1e+25
Примечания о методах преобразования чисел:
- Преобразование числа всегда терпит неудачу, если первый символ после обрезки пробела не является числом.
-
parseInt
возвращает целочисленное представление первого аргумента. Когда radix (второй аргумент) опущен, радиус зависит от данного входа.0_
= восьмеричный (base-8),0x_
= шестнадцатеричный (base-16). По умолчанию: base-10.parseInt
игнорирует любые нецифровые символы, даже если аргумент был фактически числом: См. h, i.
Чтобы избежать неожиданных результатов, всегда указывайте радиус, обычно 10:parseInt(number, 10)
. -
parseFloat
является наиболее толерантным преобразователем. Он всегда интерпретирует ввод как base-10, независимо от префикса (в отличие отparseInt
). Для точных правил синтаксического анализа см. здесь.
Следующие методы всегда не смогут вернуть значимое значение, если строка содержит любые символы, отличные от числа. (допустимые примеры:1.e+0 .1e-1
) -
+n, 1*n, n*1, n/1
иNumber(n)
эквивалентны. -
~~n, 0|n, n|0, n^1, 1^n, n&n, n<<0
иn>>0
эквивалентны. Это подписанные побитовые операции и всегда будут возвращать числовое значение (ноль вместоNaN
). -
n>>>0
также побитовая операция, но не сохраняет знаковый бит. Следовательно, можно представить только положительные числа, а верхняя граница 2 32 вместо 2 31. - При передаче объекта
parseFloat
иparseInt
будет рассмотрен только метод.toString()
. Другие методы сначала ищут.valueOf()
, затем.toString()
. См. q - t. -
NaN
, "Не номер":typeof NaN === 'number'
NaN !== NaN
. Из-за этой неловкости используйтеisNaN()
, чтобы проверить, имеет ли значениеNaN
.
Когда использовать какой метод?
-
parseFloat( x )
, когда вы хотите получить как можно больше числовых результатов (для данной строки). -
parseFloat( (x+'').replace(/^[^0-9.-]+/,'') )
, когда вы хотите получить еще больше числовых результатов. -
parseInt( x, 10 )
, если вы хотите получить целые числа. -
+x, 1*x ..
, если вас беспокоит только получение истинных числовых значений объекта, отклонение любых недопустимых чисел (какNaN
). -
~~, 0| ..
, если вы хотите всегда получать числовой результат (ноль для недопустимого). -
>>>0
, если отрицательных чисел не существует.
Последние два метода имеют ограниченный диапазон. Посмотрите на нижний колонтитул стола.
Самый короткий способ проверить, является ли данный параметр реальным числом, объясняется в этом ответе:
function isNumber(n) {
return typeof n == 'number' && !isNaN(n - n);
}