J'essaie d'obtenir le plus grand nombre d'une simple array
:
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(data));
J'ai lu que si même l'une des valeurs du tableau ne pouvait pas être convertie en nombre, elle renverrait NaN
, mais dans mon cas, j'ai vérifié avec typeof
de m'assurer qu'elles étaient toutes numériques, alors que peut-il être mon problème?
La raison pour laquelle votre code ne fonctionne pas est que Math.max
s'attend à ce que chaque paramètre soit un nombre valide. Ceci est indiqué dans la documentation comme suit:
Si au moins un des arguments ne peut pas être converti en nombre, le résultat est NaN.
Dans votre exemple, vous ne fournissez qu'un argument, et cette valeur est un tableau et non un nombre (cela ne va pas jusqu'à vérifier le contenu d'un tableau, il faut simplement savoir que ce n'est pas un nombre valide).
Une solution possible consiste à appeler explicitement la fonction en transmettant un tableau d'arguments. Ainsi:
Math.max.apply(Math, data);
Cela a effectivement le même effet que si vous spécifiiez manuellement chaque argument sans tableau:
Math.max(4, 2, 6, 1, 3, 7, 5, 3);
Et comme vous pouvez le constater, chaque argument est maintenant un nombre valide. Il fonctionnera donc comme prévu.
si vous voyez doc pour Math.max vous pouvez voir la description suivante
Max () étant une méthode statique de Math, vous l’utilisez toujours comme Math.max () plutôt que comme méthode d’un objet Math que vous avez créé (Math n’est pas un constructeur).
Si aucun argument n'est donné, le résultat est -Infinity.
Si au moins un des arguments ne peut pas être converti en nombre, le résultat est NaN.
Lorsque vous appelez Math.max
avec un paramètre de tableau comme
Math.max([1,2,3])
vous appelez cette fonction avec le paramètre one - [1,2,3]
et javascript essayez de la convertir en nombre et obtenez ("1,2,3" -> NaN) échouer.
Résultat attendu - NaN
NOTE: si un tableau avec seulement un nombre - tout fonctionne correctement
Math.max([23]) // return 23
parce que [23] -> "23" -> 23
et dissimulé à Nombre est fait.
Si vous voulez obtenir l’élément max du tableau, vous devez utiliser appliquer function, comme
Math.max.apply(Math,[1,2,3])
ou vous pouvez utiliser l’opérateur new spread
Math.max(...[1,2,3])
Cela ne fonctionne pas car vous passez un tableau en tant que paramètre au lieu de nombres séparés par des virgules. Essayez de répandre le tableau comme ceci:
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(...data));
Si vous devez utiliser la fonction Math.max et qu'un numéro du tableau peut être indéfini, vous pouvez utiliser:
x = Math.max(undefined || 0, 5)
console.log(x) // prints 5