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進数なんて使うのかね。。そういオーバースペックっぽいところも面白いよね。