1. ホーム
  2. ジャバスクリプト

[解決済み】Array#mapでparseIntがNaNになるのはなぜ?

2022-03-28 01:42:08

質問

から モジラデベロッパーネットワーク :

[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]

解決方法は?

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

同じ Mozillaのページ にリンクしています。

<ブロッククオート

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

そのため、ある関数を呼び出すと parseInt で、実際には の引数を取ると、2番目の引数は要素のインデックスになります。

この場合、結局は parseInt を基数 0, 1, 2 で順番に指定します。 1はパラメータを供給していないのと同じなので、入力(この場合は基数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 .)