是否有任何使用此方法将string转换为整数的副作用

有没有任何副作用,如果我将string转换为像下面的数字..

var numb=str*1; 

如果我检查下面的代码它说这是一个数字..

 var str="123"; str=str*1; if(!isNaN(str)) { alert('Hello'); } 

请让我知道如果有任何使用这种方法的疑虑..

当使用parseFloatparseInt ,转换不太严格。 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/1Number(n)是等价的。
  • ~~n, 0|n, n|0, n^1, 1^n, n&n, n<<0n>>0是等价的。 这些是有符号的按位运算,并且总是返回一个数值(零而不是NaN )。
  • n>>>0也是一个按位操作 ,但不保留一个符号位。 因此,只有正数可以表示,而上限是2 32而不是2 31
  • 当传递一个对象时, parseFloatparseInt只会查看.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); }