単純なarray
から最大数を取得しようとしています。
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(data));
配列内の値の1つでも数値に変換できない場合、NaN
を返しますが、私の場合は、typeof
でダブルチェックしてそれらはすべて数字であると確信しているので、私の問題は何ですか?
コードが機能しない理由は、Math.max
は、各パラメーターが有効な数値であることを期待しています。これは、次のように documentation に示されています。
少なくとも1つの引数を数値に変換できない場合、結果はNaNになります。
あなたのインスタンスでは、1つの引数のみを提供し、その1つの値は数値ではなく配列です(配列内にあるものをチェックするまでは行かず、有効な数値ではないことを知るだけで停止します)。
考えられる解決策の1つは、引数の配列を渡すことで関数を明示的に呼び出すことです。そのようです:
Math.max.apply(Math, data);
これが効果的に行うことは、配列なしで各引数を手動で指定した場合と同じです。
Math.max(4, 2, 6, 1, 3, 7, 5, 3);
ご覧のとおり、各引数は有効な数値になっているため、期待どおりに機能します。
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])
コンマ区切りの数値ではなく配列をパラメーターとして渡すため、機能しません。このように配列を広げてみてください:
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(...data));
Math.max関数を使用する必要があり、配列の1つの番号が未定義である可能性がある場合、次を使用できます。
x = Math.max(undefined || 0, 5)
console.log(x) // prints 5