Почему 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