Array#map で parseInt が NaN を返すのはなぜですか? 質問する

Array#map で parseInt が NaN を返すのはなぜですか? 質問する

からMozilla 開発者ネットワーク:

[1,4,9].map(Math.sqrt)

結果は次のようになります:

[1,2,3]

ではなぜこうなるのでしょうか:

['1','2','3'].map(parseInt)

結果は次のようになります:

[1, NaN, NaN]

私は Firefox 3.0.1 と Chrome 0.3 でテストしましたが、免責事項として、これはクロスブラウザ機能ではない (IE なし) ことは承知しています。

次のようにすると、目的の効果が得られることがわかりました。ただし、それでも の誤った動作は説明されませんparseInt

['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]

ベストアンサー1

のコールバック関数には3 つのArray.mapパラメータがあります。

同じMozilla ページリンク先:

コールバックは、要素の値、要素のインデックス、および走査される配列オブジェクトの 3 つの引数で呼び出されます。

parseIntしたがって、実際に2 つの引数を必要とする関数を呼び出す場合、2 番目の引数は要素のインデックスになります。

parseIntこの場合、基数 0、1、2 を順番に呼び出しました。最初のものはパラメータを指定しないのと同じなので、入力に基づいてデフォルト設定されます (この場合は基数 10)。基数 1 は不可能な基数であり、基数 2 では 3 は有効な数値ではありません。

parseInt('1', 0); // OK - gives 1
parseInt('2', 1); // FAIL - 1 isn't a legal radix
parseInt('3', 2); // FAIL - 3 isn't legal in base 2 

したがって、この場合はラッパー関数が必要です。

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

またはES2015+構文の場合:

['1','2','3'].map(num => parseInt(num, 10));

(どちらの場合も、示されているように に基数を明示的に指定するのが最善ですparseInt。そうしないと、入力に基づいて基数が推測されます。一部の古いブラウザでは、先頭の 0 によって 8 進数が推測され、問題が発生する傾向がありました。文字列が で始まる場合は、依然として 16 進数が推測されます0x。)

おすすめ記事