javascript - objects - ¿Por qué math.max() devuelve NaN con una matriz de enteros?
typescript max in array (4)
Estoy tratando de obtener el número más alto de una
array
simple:
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(data));
He leído que si incluso uno de los valores de la matriz no se puede convertir a número, devolverá
NaN
, pero en mi caso, he verificado dos
typeof
con
typeof
para asegurarme de que son todos números, entonces, ¿qué puede ser ¿mi problema?
La razón por la cual su código no funciona es porque
Math.max
espera que cada parámetro sea un número válido.
Esto se indica en la
documentación de la
siguiente manera:
Si al menos uno de los argumentos no se puede convertir a un número, el resultado es NaN.
En su caso, solo está proporcionando 1 argumento, y ese 1 valor es una matriz, no un número (no llega a verificar lo que está en una matriz, simplemente se detiene al saber que no es un número válido).
Una posible solución es llamar explícitamente a la función pasando una matriz de argumentos. Al igual que:
Math.max.apply(Math, data);
Lo que esto hace efectivamente es lo mismo que si especificara manualmente cada argumento sin una matriz:
Math.max(4, 2, 6, 1, 3, 7, 5, 3);
Y como puede ver, cada argumento ahora es un número válido, por lo que funcionará como se esperaba.
No funciona porque está pasando una matriz como parámetro en lugar de números separados por comas. Intente difundir la matriz de esta manera:
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(...data));
Si tiene que usar la función Math.max y un número de la matriz puede estar indefinido, puede usar:
x = Math.max(undefined || 0, 5)
console.log(x) // prints 5
si ve el documento para Math.max , puede ver la siguiente descripción
Debido a que max () es un método estático de Math, siempre lo usa como Math.max (), en lugar de como un método de un objeto Math que creó (Math no es un constructor).
Si no se dan argumentos, el resultado es -Infinity.
Si al menos uno de los argumentos no se puede convertir a un número, el resultado es NaN.
Cuando llamas a
Math.max
con un parámetro de matriz como
Math.max([1,2,3])
llama a esta función con
un
parámetro:
[1,2,3]
y javascript intenta convertirlo en número y obtener ("1,2,3" ->
NaN
) falla.
Así resultado como se esperaba -
NaN
NOTA: si la matriz tiene solo un número, todos funcionan correctamente
Math.max([23]) // return 23
porque
[23] -> "23" -> 23
y encubierto a Number está hecho.
Si desea obtener el elemento max de la matriz, debe usar la función de apply , como
Math.max.apply(Math,[1,2,3])
o puede usar el nuevo operador de propagación
Math.max(...[1,2,3])