web-dev-qa-db-ja.com

math.max()が整数の配列でNaNを返すのはなぜですか?

単純なarrayから最大数を取得しようとしています。

data = [4, 2, 6, 1, 3, 7, 5, 3];

alert(Math.max(data));

配列内の値の1つでも数値に変換できない場合、NaNを返しますが、私の場合は、typeofでダブルチェックしてそれらはすべて数字であると確信しているので、私の問題は何ですか?

31
Matt Welander

コードが機能しない理由は、Math.maxは、各パラメーターが有効な数値であることを期待しています。これは、次のように documentation に示されています。

少なくとも1つの引数を数値に変換できない場合、結果はNaNになります。

あなたのインスタンスでは、1つの引数のみを提供し、その1つの値は数値ではなく配列です(配列内にあるものをチェックするまでは行かず、有効な数値ではないことを知るだけで停止します)。

考えられる解決策の1つは、引数の配列を渡すことで関数を明示的に呼び出すことです。そのようです:

Math.max.apply(Math, data);

これが効果的に行うことは、配列なしで各引数を手動で指定した場合と同じです。

Math.max(4, 2, 6, 1, 3, 7, 5, 3);

ご覧のとおり、各引数は有効な数値になっているため、期待どおりに機能します。

55
musefan

Math.max のドキュメントが表示されたら、次の説明を見ることができます

Max()はMathの静的メソッドであるため、作成したMathオブジェクトのメソッドとしてではなく、常にMath.max()として使用します(Mathはコンストラクターではありません)。

引数が指定されていない場合、結果は-Infinityになります。

少なくとも1つの引数を数値に変換できない場合、結果はNaNになります。

次のような配列パラメーターでMath.maxを呼び出すとき

Math.max([1,2,3])

この関数をoneパラメーターで呼び出します-[1,2,3]およびjavascriptは、数値に変換して取得します( "1,2,3"-> NaN)失敗します。
だから期待通りの結果-NaN

注:one数だけの配列の場合-すべて正しく動作します

 Math.max([23]) // return 23

[23] -> "23" -> 23とNumberへの変換が完了したためです。


配列から最大要素を取得する場合は、 apply 関数を使用する必要があります。

Math.max.apply(Math,[1,2,3])

または、 新しいスプレッド演算子 を使用できます

Math.max(...[1,2,3])
21
Grundy

コンマ区切りの数値ではなく配列をパラメーターとして渡すため、機能しません。このように配列を広げてみてください:

data = [4, 2, 6, 1, 3, 7, 5, 3];    
alert(Math.max(...data));
9
Bijoy Thangaraj

Math.max関数を使用する必要があり、配列の1つの番号が未定義である可能性がある場合、次を使用できます。

x = Math.max(undefined || 0, 5)
console.log(x) // prints 5
1
dpolicastro