var a = parseInt("09"), b = Number(" 09");
多くの人は a と b の値が両方とも 9 であると考えますが、実際にはそうではありません。
parseInt の主な機能は、文字列を整数に変換すること、または 10 進数を整数に変換することです。通常、最初のパラメータのみを使用します。しかし、実際には、次の 2 つのパラメータがあります:
parseInt(string, radix)
parseInt は、
alert(parseInt("10", 2)) // '2' を出力します。 >
radix が指定されていない場合、または radix が 0 の場合、parseInt は 10 進数に変換されます。ただし、これは場合によっては少し特殊です。
* 文字列値が「0x」で始まる場合、parseInt は 16 進数に変換します。
* 文字列値が「0」で始まる場合は、最初に、parseInt は 8 進数に変換されます。
コードの先頭に戻りますが、「09」は「0」で始まるため、parseInt は 8 進数に従って変換されますが、「9」は正当な 8 進数値ではありません (8 進数は 0 の 8 桁しかありません) -7) なので、変換結果は 0 になります。
このトラップを回避するには、基数を強制的に指定します:
alert(parseInt("09", 10)); // '9' を出力
他のネチズンからの追加コメント:
コードを見てください。
alert(parseInt(0.000001)); 🎜>alert(parseInt(0.0000001));
最初のステートメントは 0 を出力し、2 番目のステートメントは 1 を出力します。恥ずかしいことです。
引き続きコードを確認します:
alert('0.0000001'));
はすべて 0 を出力します。これは期待どおりです。
ECMA-262 仕様を見ると、parseInt は最初に toString メソッドを呼び出します。問題は徐々に明らかになってきました:
alert(0.0000001);
最初のステートメントはそのまま出力され、2 番目のステートメントは 1e-7 を出力します。 1 ToString を Number Type 1 フェスティバルに適用すると、突然気づきました:
コードをコピー
コードは次のとおりです: assertEquals("0.00001", (0.00001 ).toString()); assertEquals("0.000001", (0.000001).toString());
assertEquals("1e-7", (0.0000001) ).toString());
assertEquals( "1.2e-7", (0.00000012).toString());
assertEquals("1.23e-7", (0.000000123).toString()); 🎜>assertEquals("1e-8", (0.00000001 ).toString());
assertEquals("1.2e-8", (0.000000012).toString());上記は、ECMA 仕様の適切な解釈である、V8 エンジンのnumber-tostring の単体テスト スクリプトです。
概要: 1e-6 未満の値の場合、ToString は自動的に科学表記法に変換します。したがって、パラメーターの型が不明な場合は、parseInt メソッドをカプセル化するのが最善です。
コードをコピー
コードは次のとおりです。
blueidea の上の記事:
去年の 11 月に作ったものが、今年の 8 月か 9 月に突然おかしくなりました
1x 分間デバッグした後、最終的にそれが問題であることがわかりましたparseInt
MSDN の説明
説明
文字列を整数に変換します。
構文
parseInt(numstring, [radix])
parseInt メソッドの構文には次の部分があります。
部分 説明
[numstring] 数値に変換する文字列。
[radix] オプション。指定しない場合は、数値の基数を示します。プレフィックス「0x」の付いた文字列は 16 進数とみなされ、他のすべての文字列は 10 進数とみなされます (2005-10-08 など)。正規表現を使用して年、月、日の文字列を解決し、parseInt を使用して数値を他の用途にデコードします。
上は違うの?
8 進数には 8 がないため、文字列「08」は 8 進数として認識され、parseInt("08") は 0 を返します。
通常、parseInt は次の基数の書き込みには使用されません。デフォルトは次のとおりです。 10 進数
今では、誰もがもっと熱心に、安全のために 10 をもっと書く必要があるようです。