[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
。)