Risposta breve
Per ECMAScript 5 Utenti:
#1
if(x !== x) {
console.info('x is NaN.');
}
else {
console.info('x is NOT a NaN.');
}
Per le persone con ECMAScript-6:
#2
Number.isNaN(x);
E per coerenza scopo su ECMAScript 5 & 6 entrambi, è anche possibile utilizzare questo polyfill for Number.isNan
#3
//Polyfill from MDN
Number.isNaN = Number.isNaN || function(value) {
return typeof value === "number" && isNaN(value);
}
// Or
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
Nota: preferisco testare usando # 1 che funziona lo stesso tutti i luoghi e non ha dipendenza da ultimo JS anche. (Mi dà sempre risultato corretto. Nessuna sorpresa!)
Spiegazione dettagliata:
ecco il nostro impressionante NaN
NaN == NaN; // false
NaN === NaN; // false
Si prega di non dare la colpa JavaScript
per questo, è NaN che dovrebbe comportarsi in questo anche in altre lingue Che va bene come da rationale for all comparisons returning false NaN values
Così viene isNaN
come nostro salvatore, ma aspetta agisce po 'diverso in alcuni scenari, come
isNaN(undefined); // true
isNaN({}); // true
isNaN("lorem ipsum"); // true
ho avuto alcune facce strane vedendo i risultati di cui sopra. E qui viene il motivo da MDN
Quando l'argomento della funzione isNaN non è di tipo Numero, il valore viene prima convertito in un numero. Il valore risultante viene quindi testato per determinare se si tratta di NaN.
Quindi, come dovremmo testare NaN per le variabili non numeriche? Vado sempre dal seguente
if(x !== x) {
console.info('Is a NaN');
}
else {
console.info('Not a NaN');
}
ECMAScript-6/JavaScript-2015 Aggiornamenti
Abbiamo qualcosa in ECMAScript-6 per lo stesso. Yup che facciamo ...
Number.isNaN(x); // true
L'implementazione ES6 sarà anche utile per i casi di cui sopra come
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN("lorem ipsum"); // false
mentre ECMAScript-5 funzione globale isNaN
uscite in true
per i casi di cui sopra, che a volte possono non in linea con le nostre aspettative.
"* Non vuoi sapere come ho imparato a conoscere questo difetto. *" - Mi chiedo perché chiameresti 'isNaN' su un array? – Bergi
@Bergi - Stavo scrivendo un selezionatore di date. Ho quasi preso a pugni lo schermo quando '[" 2015 "," 05 "," 05 "]' è stato contrassegnato come NaN. – Malvolio
Ma perché ti aspetti che un array si comporti come un numero? – Bergi