it-swarm.com.de

warum math.max () NaN mit einem Array von ganzen Zahlen zurückgibt

Ich versuche die höchste Zahl von einer einfachen array zu erhalten:

data = [4, 2, 6, 1, 3, 7, 5, 3];

alert(Math.max(data));

Ich habe gelesen, dass selbst wenn einer der Werte im Array nicht in eine Zahl konvertiert werden kann, NaN zurückgegeben wird. In meinem Fall habe ich jedoch mit typeof nachgeprüft, ob sie alle Zahlen sind mein Problem?

27
Matt Welander

Der Grund dafür, dass Ihr Code nicht funktioniert, liegt darin, dass Math.max erwartet, dass jeder Parameter eine gültige Zahl ist. Dies ist in der Dokumentation wie folgt angegeben:

Wenn mindestens eines der Argumente nicht in eine Zahl konvertiert werden kann, lautet das Ergebnis NaN.

In Ihrer Instanz geben Sie nur ein Argument an, und dieser Wert ist ein Array und keine Zahl (es geht nicht so weit, zu überprüfen, was sich in einem Array befindet;.

Eine mögliche Lösung ist der explizite Aufruf der Funktion durch Übergeben eines Argumentarrays. So wie:

Math.max.apply(Math, data);

Was dies bewirkt, ist dasselbe, als wenn Sie jedes Argument ohne Array manuell angegeben hätten:

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

Und wie Sie sehen, ist jedes Argument jetzt eine gültige Zahl, so dass es wie erwartet funktioniert.

49
musefan

wenn Sie doc für Math.max sehen, sehen Sie die nächste Beschreibung

Da max () eine statische Methode von Math ist, verwenden Sie sie immer als Math.max () und nicht als Methode eines von Ihnen erstellten Math-Objekts (Math ist kein Konstruktor).

Wenn keine Argumente angegeben werden, lautet das Ergebnis -Infinity.

Wenn mindestens eines der Argumente nicht in eine Zahl konvertiert werden kann, lautet das Ergebnis NaN.

Wenn Sie Math.max mit einem Array-Parameter wie aufrufen

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

sie rufen diese Funktion mit dem Parameter one auf - [1,2,3] und Javascript versuchen es in number umzuwandeln und erhalten ("1,2,3" -> NaN) einen Fehler.
.__ Ergebnis also wie erwartet - NaN

HINWEIS: if Array mit nur one number - alles funktioniert einwandfrei 

 Math.max([23]) // return 23

weil [23] -> "23" -> 23 und verdeckt zu Nummer ausgeführt wird.


Wenn Sie max Element aus einem Array erhalten möchten, sollten Sie apply function verwenden, wie

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

oder Sie können den neuen Spread-Operator verwenden

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

Es funktioniert nicht, weil Sie anstelle von durch Kommas getrennten Zahlen ein Array als Parameter übergeben. Versuchen Sie, das Array so zu verteilen:

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

Wenn Sie die Math.max-Funktion verwenden müssen und eine Nummer des Arrays möglicherweise undefiniert ist, können Sie Folgendes verwenden:

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