14

重複の可能性:
javascript-Array.mapおよびparseInt

次のコードスニペットに出くわしました。

> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]

ここで何が起こっているのですか?

4

2 に答える 2

13

Array.prototype.mapのドキュメントを参照することから始めます。重要なのは次の行です。

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

(強調鉱山)

次に、ドキュメントでparseIntを確認します。

parseInt関数は、最初の引数を文字列に変換して解析し、整数またはNaNを返します。NaNでない場合、戻り値は、指定された基数(基数)の数値として取得された最初の引数の10進整数表現になります。たとえば、基数10は、10進数、8進数、8進数、16進数などから変換することを示します。10を超える基数の場合、アルファベットの文字は9より大きい数字を示します。たとえば、16進数(16進数)の場合、AからFが使用されます。

と:

基数が未定義または0の場合、JavaScriptは次のことを想定しています。

  • 入力文字列が「0x」または「0X」で始まる場合、基数は16(16進数)です。

  • 入力文字列が「0」で始まる場合、基数は8(8進数)です。この機能は非標準であり、一部の実装では意図的にサポートされていません(代わりに基数10を使用)。このため、parseIntを使用する場合は、常に基数を指定してください。

  • 入力文字列が他の値で始まる場合、基数は10(10進数)です。

したがって、最初の呼び出しは次のとおりです。

parseInt('10',0, ['10','10',...]) // => 10 (because radix=0)

2番目は:

parseInt('10',1, ['10','10',...]) // => NaN because radix is 1

第3:

parseInt('10',2, ['10','10',...]) // => 2 because 10 in binary is the number "2"

等々。

于 2013-01-26T08:38:24.983 に答える
5

MDN docuから:

parseIntは、多くの場合1つの引数で使用されますが、2つかかります。2番目は基数ですコールバック関数に、Array.prototype.mapは3つの引数を渡します:要素、インデックス、配列3番目の引数はparseIntによって無視されますが、2番目の引数は無視されるため、混乱が生じる可能性があります。

したがって、実際にparseIntは次の値が渡されます。

// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.

したがって、毎回異なる基数を使用しているため、結果が表示されます。

于 2013-01-26T08:39:03.007 に答える