JavaScriptのparseFloat()
とparseInt()
について、仕様を参照しつつ、適当な値を渡して何を返すか実験してみる。
parseFloat(string)の仕様
仕様では、parseFloat()
は以下のような処理を実行するよう定められている。
- 引数に渡された値を文字列に変換する。
- 変換した文字列の前後の空白を削除する。
- 空白を削除した文字列をUnicodeコードポイントの配列に変換する。
+
あるいは-
、あるいは数値で始まる10進数の文字列を、先頭から可能な限り長く取得する(取得できない文字列はNaN
を返す)。- パースした浮動小数点数を返す。
上記の通り、parseFloat()
は、渡された文字列の先頭から数値(10進数リテラル)に解釈できるものを取り出し、解釈できなかった時点で処理を止める。10進数リテラルに解釈できなかった部分はただ無視され、そのことに対する情報は示されない。
parseInt(string, radix)の仕様
parseInt()
の仕様は、以下のような手順を定めている。
- 第1引数に渡された値を文字列に変換する。
- 変換した文字列の前後の空白を削除する。
- 符号を
1
にする。 - 文字列の先頭が
0x002D
(HYPHEN-MINUS)なら、符号を-1
にする。 - 文字列の先頭が
0x002B
(PLUS SIGN)か0x002D
(HYPHEN-MINUS)なら、文字列をインデックス1
からの部分文字列と解釈する。 - 第2引数に渡された基数を、32ビット整数に変換する。
stripPrefix
フラグ(接頭辞を削除するかどうか)をtrue
とする。- 基数が
0
でなく、2
より小さい、あるいは36
より大きいとき、NaN
を返す。 - 基数が
0
でなく、16
でもないとき、stripPrefix
フラグをfalse
とする。 - 基数が
0
のとき、基数を10
とする。 stripPrefix
フラグがtrue
のときで、文字列の長さが2
以上かつ文頭が0x
か0X
のとき、文字列をインデックス2
からの部分文字列と判断し、基数を16
とする。- ここまでに定まった基数桁に含まれる数字を先頭から探していき、該当しない文字を見つけた時点で終端と判断する。
- もし文頭から終端までが空なら、
NaN
を返す。 - パースした整数を定まった基数で計算し直し、10進数を返す(負数の場合のみ
-
がつく。また、20桁以上桁は0
としても良い)。
parseFloat()
と同じく、文頭の+
と-
を除き、指定された基数の桁に含まれない文字はただ無視される。
返す値のサンプル
当然だが、仕様の通りである。parseInt()
に渡す基数が変わると、NaN
だった文字列が急に意味を持つのが地味におもしろく、直感的に理解しづらい。
例えばparseInt(102, 2)
の返り値は2
となる。処理の流れとしては、まず102
の先頭から2進数が探され、10
が取得される。次に2進数の10
が10進数に直されて2
となり、これが返される。
整理してみたらわりと簡単だった。わかりづらいと感じたのは私だけかもしれない。