6

以下のように文字列を数値に変換すると、副作用はありますか..

var numb=str*1;

以下のコードで確認すると、これは数値であることがわかります..

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

この方法を使用する上で懸念がある場合はお知らせください。

4

1 に答える 1

25

parseFloat、またはを使用するとparseInt、変換は厳密ではなくなります。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最初の引数の整数表現を返します。基数 (2 番目の引数) を省略した場合、基数は指定された入力に依存します。
    0_= 8 進数 (基数 8)、0x_= 16 進数 (基数 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/1Number(n)同等です。
  • ~~n, 0|n, n|0, n^1, 1^n, n&n, n<<0n>>0同等です。これらは符号付きのビット演算であり、常に数値 ( ではなくゼロNaN) を返します。
  • n>>>0ビット演算ですが、符号ビットは予約されません。したがって、正の数のみを表すことができ、上限は 2 31ではなく2 32です。

  • オブジェクトが渡されるparseFloatparseInt、メソッドのみが表示されます.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 ..オブジェクトの真の数値を取得することのみに関心があり、無効な数値を拒否する場合 ( as NaN)。
  • ~~, 0| ..常に数値の結果を取得する場合 (無効の場合はゼロ)。
  • >>>0負の数が存在しない場合。
    最後の 2 つの方法の範囲は限られています。表のフッターを見てください。

特定のパラメーターが実数であるかどうかをテストする最短の方法は、この回答で説明されています。

function isNumber(n) {
    return typeof n == 'number' && !isNaN(n - n);
}
于 2011-11-13T16:06:10.710 に答える