When you use parseFloat
, or parseInt
, the conversion is less strict. 1b5
-> 1.
Using 1*number
or +number
to convert will result in NaN
when the input is not valid number. Though unlike parseInt
, floating point numbers will be parsed correctly.
Table covering all possible relevant options.
//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) (-∞,+∞) (-∞,+∞) (-231,+231) [0, 232)
// 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
Notes on number conversion methods:
- The number conversion always fail if the first character, after trimming white-space, is not a number.
parseInt
returns an integer representation of the first argument. When the radix (second argument) is omitted, the radix depends on the given input.
0_
= octal (base-8), 0x_
= hexadecimal (base-16). Default: base-10.
parseInt
ignores any non-digit characters, even if the argument was actually a number: See h, i.
To avoid unexpected results, always specify the radix, usually 10: parseInt(number, 10)
.
parseFloat
is the most tolerant converter. It always interpret input as base-10, regardless of the prefix (unlike parseInt
). For the exact parsing rules, see here.
The following methods will always fail to return a meaningful value if the string contains any non-number characters. (valid examples: 1.e+0 .1e-1
)
+n, 1*n, n*1, n/1
and Number(n)
are equivalent.
~~n, 0|n, n|0, n^1, 1^n, n&n, n<<0
and n>>0
are equivalent. These are signed bitwise operations, and will always return a numeric value (zero instead of NaN
).
n>>>0
is also a bitwise operation, but does not reserve a sign bit. Consequently, only positive numbers can be represented, and the upper bound is 232 instead of 231.
- When passed an object,
parseFloat
and parseInt
will only look at the .toString()
method. The other methods first look for .valueOf()
, then .toString()
. See q - t.
NaN
, "Not A Number":
typeof NaN === 'number'
NaN !== NaN
. Because of this awkwardness, use isNaN()
to check whether a value is NaN
.
When to use which method?
parseFloat( x )
when you want to get as much numeric results as possible (for a given string).
parseFloat( (x+'').replace(/^[^0-9.-]+/,'') )
when you want even more numeric results.
parseInt( x, 10 )
if you want to get integers.
+x, 1*x ..
if you're only concerned about getting true numeric values of a object, rejecting any invalid numbers (as NaN
).
~~, 0| ..
if you want to always get a numeric result (zero for invalid).
>>>0
if negative numbers do not exists.
The last two methods have a limited range. Have a look at the footer of the table.
The shortest way to test whether a given parameter is a real number is explained at this answer:
function isNumber(n) {
return typeof n == 'number' && !isNaN(n - n);
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…