ホームページ > ウェブフロントエンド > jsチュートリアル > jsのparseInt_javascriptスキルのトラップ解析まとめ

jsのparseInt_javascriptスキルのトラップ解析まとめ

WBOY
リリース: 2016-05-16 18:09:42
オリジナル
1005 人が閲覧しました
コードをコピー コードは次のとおりです:

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( parseInt('0.000001'));
alert('0.0000001'));


はすべて 0 を出力します。これは期待どおりです。
ECMA-262 仕様を見ると、parseInt は最初に toString メソッドを呼び出します。問題は徐々に明らかになってきました:



コードをコピー コードは次のとおりです: alert( 0.000001);
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 メソッドをカプセル化するのが最善です。



コードをコピー


コードは次のとおりです。
function parseInt2(a) { if(typeof a === 'number') { return Math.floor(a) } return parseInt; (a);}

blueidea の上の記事:
去年の 11 月に作ったものが、今年の 8 月か 9 月に突然おかしくなりました
1x 分間デバッグした後、最終的にそれが問題であることがわかりましたparseInt

MSDN の説明
説明
文字列を整数に変換します。
構文
parseInt(numstring, [radix])
parseInt メソッドの構文には次の部分があります。
部分 説明
[numstring] 数値に変換する文字列。
[radix] オプション。指定しない場合は、数値の基数を示します。プレフィックス「0x」の付いた文字列は 16 進数とみなされ、他のすべての文字列は 10 進数とみなされます (2005-10-08 など)。正規表現を使用して年、月、日の文字列を解決し、parseInt を使用して数値を他の用途にデコードします。



[Ctrl A すべて選択 注: 外部 Js を導入する必要がある場合は、更新して実行する必要があります ]


上は違うの?
8 進数には 8 がないため、文字列「08」は 8 進数として認識され、parseInt("08") は 0 を返します。
通常、parseInt は次の基数の書き込みには使用されません。デフォルトは次のとおりです。 10 進数
今では、誰もがもっと熱心に、安全のために 10 をもっと書く必要があるようです。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート