6

如果我将字符串转换为如下数字,是否有任何副作用..

var numb=str*1;

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

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

如果使用此方法有任何问题,请告诉我。

4

1 回答 1

25

当您使用parseFloat, orparseInt时,转换不那么严格。1b5-> 1。

使用1*numberor+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返回第一个参数的整数表示。当基数(第二个参数)被省略时,基数取决于给定的输入。
    0_= 八进制 (base-8), 0x_= 十六进制 (base-16)。默认值:base-10。
    parseInt忽略任何非数字字符,即使参数实际上是一个数字:参见h, i
    为避免意外结果,请始终指定基数,通常为 10: parseInt(number, 10)
  • parseFloat是最宽容的转换器。它总是将输入解释为以 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);
}
于 2011-11-13T16:06:10.710 回答