['1', '2', '3'].map(parseInt) => [1, NaN, NaN]の謎

今まで['1', '2', '3'].map(parseInt)が意図した結果にならない([1, 2, 3]にならない)のは知っていたのだけど、理由がよくわからなかったので調べてみた。


JavaScriptのparseIntとmapを組み合わせる際の注意より:

mapに渡した関数には、引数としてvalue, index, selfが渡される。

を見てわかった。parseIntの基数にindexの値が渡されてるのかーと。

parseInt('1', 0);  // => 1
parseInt('2', 1);  // => NaN
parseInt('3', 2);  // => NaN

ということみたい。


parseFloatの場合は基数とかないので[1, 2, 3]が返ってくる。整数が欲しい場合は向かないけど……

lodashを使っている場合は_.parseIntを使えば基数を省略した場合は10が指定されるので想定した値が返ってくる。

まあ、ちょっとタイプして

['1', '2', '3'].map(function(val) {
  return parseInt(val, 10);
});

で良いのだけど。