1. ホーム
  2. javascript

[解決済み] parseInt(8,3) == NaN と parseInt(16,3) == 1 になっているのはなぜですか?

2022-04-22 13:44:25

質問

今読んでいる本 これ の中に書かれていることに戸惑いを感じています。 parseInt に基数引数を与える

なぜか parseInt(8, 3)NaNparseInt(16, 3)1 ?

8 と 16 は基数 3 ではないので、AFAIK では parseInt(16, 3) を返さなければなりません。 NaN

解決方法は?

これは、わかっていても、いつもつまずく人がいることです :-) あなたが見ているのは、同じような理由 parseInt("1abc") は1を返します。 parseInt は、最初の無効な文字で停止し、その時点で持っているものをすべて返します。もし解析すべき有効な文字がなければ、それは NaN .

parseInt(8, 3) は、パース "8" を基数3に変換することに注意してください。 8 を文字列に変換します。 仕様の詳細 ). しかし、基数3では、1桁の数字は単に 0 , 1 および 2 . を解析するように要求しているようなものです。 "9" を8進数で表示します。があったので いいえ 有効な文字、あなたは NaN .

parseInt(16, 3) をパースするように要求しています。 "16" を3進数で表したものです。を解析することができるので 1 で停止する。 6 というのは、パースできないからです。そこで 1 .


この質問は多くの注目を集め、検索結果で上位にランクインする可能性があるので、JavaScriptで文字列を数字に変換するオプションの概要と、そのさまざまな特異性と応用を紹介します(SOでの私の別の回答から引用しました)。

  • parseInt(str[, radix]) - 文字列の先頭をできる限り全体の(整数)数に変換し、末尾の余分な文字は無視します。つまり parseInt("10x")10x は無視されます。オプションの基数(数字のベース)引数をサポートし、そのため parseInt("15", 16)21 ( 15 16進数で)。基数を指定しない場合は,文字列の先頭が 0x (または 0X この場合、それらはスキップされ、16進数とみなされます。 (で始まる文字列を扱うブラウザがありました。 0 を8進数として扱いますが、この動作は指定されたことはありません。 特に禁止されている は、ES5仕様に含まれています)。 戻り値 NaN 解析可能な数字が見つからなかった場合。

  • parseFloat(str) - 様 parseInt しかし、浮動小数点数を扱い、10進数のみをサポートします。ここでも文字列上の余分な文字は無視されますので parseFloat("10.5x")10.5 (その x は無視されます)。10進数のみサポートされているため parseFloat("0x15")0 (でパースが終了するため)。 x ). 戻り値 NaN 解析可能な数字がない場合

  • 単項目 + は、例えば +str - (例:暗黙の変換) を変換します。 全体 文字列を、浮動小数点と JavaScript の標準的な数値表記(数字と小数点=10進数)を使って数値に変換します。 0x プレフィックス = 16進数。 0o prefix = octal [ES2015+] とする。 いくつか の実装では、これを拡張して、先頭の 0 を8進数として扱いますが、ストリクトモードでは扱いません)。 +"10x"NaN というのも x ではない を無視した。 +"10"10 , +"10.5"10.5 , +"0x15"21 , +"0o10"8 [ES2015+】になります。] ゲタを履かせている。 +""0 でなく NaN ということになります。

  • Number(str) - まさに暗黙の変換のように(例えば、単項の + ただし、実装によっては速度が低下します。 (関係なさそうだけど)