Почему math.max() возвращает NaN с массивом целых чисел?

Я пытаюсь получить максимальное число из простого array:

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

alert(Math.max(data));

Я прочитал, что если даже одно из значений в массиве не может быть преобразовано в число, оно вернет NaN, но в моем случае я дважды проверял с помощью typeof, чтобы убедиться, что они все числа, так что может быть моей проблемой?

Ответ 1

Причина, по которой ваш код не работает, состоит в том, что Math.max ожидает, что каждый параметр будет действительным числом. Это указано в документации следующим образом:

Если хотя бы один из аргументов не может быть преобразован в число, результатом будет NaN.

В вашем экземпляре вы предоставляете только 1 аргумент, и 1 значение - это массив, а не число (оно не подходит для проверки того, что находится в массиве, оно просто останавливается, зная, что оно недействительно число).

Одним из возможных решений является явное вызов функции путем передачи массива аргументов. Например:

Math.max.apply(Math, data);

То, что это эффективно делает, такое же, как если бы вы вручную указывали каждый аргумент без массива:

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

И как вы можете видеть, каждый аргумент теперь является допустимым числом, поэтому он будет работать как ожидалось.

Ответ 2

если вы видите doc для Math.max, вы можете увидеть следующее описание

Поскольку max() является статическим методом Math, вы всегда используете его как Math.max(), а не как метод созданного вами Math-объекта (Math не является конструктором).

Если аргументы не заданы, результатом является -Infinity.

Если хотя бы один из аргументов не может быть преобразован в число, результатом будет NaN.

Когда вы вызываете Math.max с параметром массива, например

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

вы вызываете эту функцию с параметром один - [1,2,3] и javascript попробуйте преобразовать его в число и получить ( "1,2,3" → NaN) сбой.
Результат, как и ожидалось, - NaN

ПРИМЕЧАНИЕ:, если массив с одним номером - все работает правильно

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

потому что [23] -> "23" -> 23 и скрыто для числа.


Если вы хотите получить максимальный элемент из массива, вы должны использовать apply, например

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

или вы можете использовать новый оператор распространения

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

Ответ 3

Если вам нужно использовать функцию Math.max, а одно число из массива может быть undefined, вы можете использовать:

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