Why is math.max() returning NaN on an array of integers?

Matt Welander picture Matt Welander · Sep 18, 2015 · Viewed 27.6k times · Source

I am trying to get the highest number from a simple array:

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

alert(Math.max(data));

I have read that if even one of the values in the array can't be converted to number, it will return NaN, but in my case, I have double-checked with typeof to make sure they are all numbers, so what can be my problem?

Answer

musefan picture musefan · Sep 18, 2015

The reason why your code doesn't work is because Math.max is expecting each parameter to be a valid number. This is indicated in the documentation as follows:

If at least one of arguments cannot be converted to a number, the result is NaN.

In your instance you are only providing 1 argument, and that 1 value is an array not a number (it doesn't go as far as checking what is in an array, it just stops at knowing it isn't a valid number).

One possible solution is to explicitly call the function by passing an array of arguments. Like so:

Math.max.apply(Math, data);

What this effectively does is the same as if you manually specified each argument without an array:

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

And as you can see, each argument is now a valid number, so it will work as expected.