web-dev-qa-db-fra.com

pourquoi math.max () renvoie NaN avec un tableau d’entiers?

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?

27
Matt Welander

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.

49
musefan

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])
19
Grundy

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));
6
Bijoy Thangaraj

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
0
dpolicastro