14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScriptAdvent Calendar 2015

Day 9

parseInt()は面白い。

Posted at

parseInt()。仕様が実に面白い。

parseInt()は、引数に文字列を与えると整数値に変換して返すというものだ。そして2つ目の引数で基数を指定することができる。

parseInt('10',10); // 10
parseInt('10',2); // 2
parseInt('10',8); // 8
parseInt('010'); //?

最後の4つ目。これはどう解釈されるだろうか。実は古いブラウザだったりすると、8を返す場合がある。昔は基数を省略した場合、頭が0で始まる場合8進数または10進数で解釈される仕様になっているものがあったためだ。WSHなんかはそうだった。なので期待値が10なのに8が返ってきて小一時間ハマったことがある。
ES2015の仕様では10進数で解釈されるようになっているそうなので、そういうハマりは今はないと思うが。

これはどうだろうか。10だろうか。

parseInt('0x10');

正解は16である。parseInt()の仕様では基数が省略されているかもしくは0で、文字列が0xもしくは0Xで始まる場合、16進数として解釈しようとするからだ。

次はどうだろうか

parseInt(10)

規格書によれば、引数はtoString()されるそうなので、答えは10になる。なので

parseInt(10,2); // 2
parseInt(100,2); // 4
parseInt(10,16); // 16
parseInt(10,8); // 8

となる。

後面白い仕様として、parseInt()はできる限り数字に変換しようとしてくれる。例えば

parseInt('15px'); //15
parseInt(' 15x');//15

この仕様、CSSの属性値を数値に変換するときになどに便利だったりする。
ただしこれはだめ。

parseInt('x15x');//NaN

parseInt()の基数は36まで指定できるそうだが、36進数なんて使うのかね。。そういオーバースペックっぽいところも面白いよね。

14
14
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?