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

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

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

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

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

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

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

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

 Math.max.apply(Math, data); 

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

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

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

если вы видите документ для 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 и скрыто до номера.


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

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

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

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

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

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

Он не работает, потому что вы передаете массив как параметр вместо чисел, разделенных запятыми. Попробуйте разложить массив следующим образом:

 data = [4, 2, 6, 1, 3, 7, 5, 3]; alert(Math.max(...data)); 
Давайте будем гением компьютера.