是否有任何使用此方法将string转换为整数的副作用
有没有任何副作用,如果我将string转换为像下面的数字..
var numb=str*1;
如果我检查下面的代码它说这是一个数字..
var str="123"; str=str*1; if(!isNaN(str)) { alert('Hello'); }
请让我知道如果有任何使用这种方法的疑虑..
当使用parseFloat
或parseInt
,转换不太严格。 1b5
– > 1。
当input不是有效的数字时,使用1*number
或+number
进行转换将导致NaN
。 虽然不像parseInt
,浮点数将被正确parsing。
表格涵盖所有可能的相关选项。
//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
返回第一个参数的整数表示。 当基数(第二个参数)被省略时,基数取决于给定的input。
0_
=八进制(base-8),0x_
=hex(base-16)。 默认值:base-10。
parseInt
忽略任何非数字字符,即使参数实际上是一个数字:请参阅h,i 。
为了避免意外的结果,总是指定基数,通常是10:parseInt(number, 10)
。 -
parseFloat
是最容忍的转换器。 它始终将input解释为base-10,而不pipe前缀(与parseInt
不同)。 有关确切的parsing规则,请参阅此处 。如果string包含任何非数字字符,以下方法将始终无法返回有意义的值。 (有效的例子:
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 )
当你想得到尽可能多的数字结果(给定的string)。 - 当需要更多的数字结果时
parseFloat( (x+'').replace(/^[^0-9.-]+/,'') )
。 -
parseInt( x, 10 )
如果你想获得整数。 -
+x, 1*x ..
如果你只关心获取一个对象的真正的数值,拒绝任何无效的数字(如NaN
)。 -
~~, 0| ..
~~, 0| ..
如果你想总是得到一个数字结果(零为无效)。 -
>>>0
如果负数不存在。
最后两种方法的范围有限。 看看桌子的页脚。
在这个答案中解释了testing给定参数是否是实数的最短方法:
function isNumber(n) { return typeof n == 'number' && !isNaN(n - n); }