2015-09-18 20 views
10

Sto cercando di ottenere il più alto numero da un semplice array:perché math.max() restituisce NaN con una matrice di numeri interi?

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

alert(Math.max(data)); 

Ho letto che se anche uno dei valori nella matrice non può essere convertito in numero, tornerà NaN, ma in Nel mio caso, ho ricontrollato con typeof per assicurarmi che siano tutti numeri, quindi quale può essere il mio problema?

+6

Basta vedere [doc, circa Math.max] (https: // sviluppatore .mozilla.org/it-US/docs/Web/JavaScript/Riferimento/Global_Objects/Math/max) :-) _Se almeno uno degli argomenti non può essere convertito in un numero, il risultato è ** NaN ** ._ – Grundy

+0

Questa non è una duplicazione valida secondo me. Questa domanda non è come farlo, ma più perché non funziona con un array. La domanda dupe non sembra rispondere a questo – musefan

+0

@musefan, vedere il link al documento sopra: questo array non può essere convertito in un numero :-) – Grundy

risposta

23

Il motivo per cui il codice non lo fa il lavoro è dovuto al fatto che Math.max si aspetta che ciascun parametro sia un numero valido. Questo è indicato nel documentation come segue:

Se almeno uno degli argomenti non può essere convertito in un numero, il risultato è NaN.

Nell'istanza si fornisce solo 1 argomento e 1 valore è un array non un numero (non arriva al controllo di ciò che è in un array, si ferma solo a sapere che non è un array t un numero valido).

Una possibile soluzione è chiamare esplicitamente la funzione passando una matrice di argomenti.In questo modo:

Math.max.apply(Math, data); 

Quello che fa in modo efficace è lo stesso che se è stato specificato manualmente ogni argomento senza un array:

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

E come potete vedere, ogni argomento è ora un numero valido, in modo funzionerà come previsto.

12

se si vede doc per Math.max è possibile vedere la prossima descrizione

Perché max() è un metodo statico di matematica, si usa sempre come Math.max(), piuttosto che come un metodo di una Oggetto matematico creato (Math non è un costruttore).

Se non vengono forniti argomenti, il risultato è -Infinity.

Se almeno uno degli argomenti non può essere convertito in un numero, il risultato è NaN.

Quando si chiama Math.max con parametro array come

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

si chiama questa funzione con un parametro - [1,2,3] e JavaScript cercano convertirlo in numero e ottenere ("1,2,3" - >NaN) fallire.
Così risultato come previsto - NaN

NOTA: se array con solo un numero - tutti i lavori correttamente

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

perché [23] -> "23" -> 23 e segreta per numero è fatto.


Se si desidera ottenere elemento max da matrice si dovrebbe usare apply funzione, come

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

oppure è possibile utilizzare il new spread operator

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

Se si deve usare la funzione Math.max e un numero della matrice potrebbe essere undefined, è possibile utilizzare:

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