Verificare la presenza di NaN (“non un numero”) è semplice come verificare l’uguaglianza di sé in JavaScript.
In JavaScript, il valore speciale
NaN
(che significa” non un numero “) viene utilizzato per rappresentare il risultato di un calcolo matematico che non può essere rappresentato come un numero significativo. – Joshua Clanton su A Drip of JavaScript
Il valore speciale NaN
viene visualizzato in JavaScript quando Math
le funzioni falliscono (Math.sqrt(-37)
) o quando una funzione che tenta di analizzare un numero fallisce (parseInt("No integers here")
).
NaN
quindi avvelena tutte le altre funzioni matematiche, portando a tutte le altre operazioni matematiche risultanti in NaN
.
Nota che in JavaScript, la divisione per 0 restituisce Infinity
, non NaN
:
Questo risultato è dovuto al modo in cui floating-poi nt è definito, più in generale del solo Javascript. Perché? Approssimativamente, perché 1/0 è il limite di 1 / x quando x si avvicina a zero. E 0/0 non ha alcuna interpretazione ragionevole, quindi NaN
.
Che cos’è NaN comunque?
NaN è una proprietà dell’oggetto globale. Il valore iniziale di NaN è Not-A-Number, lo stesso del valore di Number.NaN. – Documenti MDN
Verificare la presenza di NaN è più difficile di quanto sembri
Sfortunatamente, ci sono due problemi con il tentativo di controllare NaN
:
-
typeof NaN
è” number “ -
NaN
è diverso da tutti gli altri valori in JavaScript
Dai un’occhiata a questo esempio di codice:
Allora come controlliamo se abbiamo un valore NaN
che avvelenerà la matematica?
Verifica la presenza di NaN con auto-uguaglianza
” NaN, e solo NaN, sarà diverso da se stesso. ” – Documenti MDN
In JavaScript, il modo migliore per verificare la presenza di NaN
è verificare l’autoeguaglianza utilizzando uno degli operatori di uguaglianza incorporati, ==
o ===
.
Perché NaN
non è uguale a se stesso, NaN != NaN
restituirà sempre true
.
Ovviamente, tale NaN
test nel codice non è sempre leggibile, quindi è una buona idea usare un commento o creare una funzione wrapper:
Non fa differenza se utilizzi !=
o !==
per verificare NaN
.
Verifica la presenza di NaN con Object.is ()
” Il
Object.is()
determina se due valori hanno lo stesso valore.”- Documenti MDN
A differenza degli operatori di uguaglianza rigorosa e libera, il metodo di supporto ES6 Object.is()
non considera NaN
uguale a se stesso:
Quindi, se sostituisci ===
con Object.is()
, non devi mai preoccuparti sul controllo di NaN
qualsiasi modo speciale. Problema risolto!
Ho scritto su come utilizzare Object.is()
in JavaScript in un altro articolo:
Una nota sulla terminologia – Object.is()
è una funzione della classe Object
globale, non la chiamo “operatore di uguaglianza” come ==
o ===
.
Ad esempio, nei test Jest, il metodo .toBe()
che utilizza ===
è diverso dal metodo .toEqual()
che utilizza Object.is()
.
Per concludere qui, dovrei menzionare che un JavaScript ES6 Set
, utilizzato per trovare valori univoci, conserverà solo una copia di un NaN
valore.
Una parola sul numero .isNan ()
JavaScript moderno ha già un’implementazione da controllare per NaN
chiamata Number.isNan()
che funziona come pensi sarebbe. Ad esempio:
Tieni presente che Number.isNan()
è diverso dalla funzione isNan()
, che è un’implementazione precedente il cui scopo effettivo è verificare se un valore non può essere costretto a un numero.
Ecco la differenza, per completezza:
-
isNaN()
restituiràtrue
se il valore è attualmenteNaN
o se saràNaN
dopo che è stato convertito in un numero. In altre parole, se riceve un valore che può essere convertito in un numero, isNaN () restituirà false. -
Number.isNaN()
restituiràtrue
solo se il valore è attualmenteNaN
.
Quindi, se supporti i vecchi browser (specialmente Internet Explorer) che non supportano Number.isNan()
, allora è meglio controllare l’auto-uguaglianza.