Ho una confusione nel funzionamento di NaN. Ho eseguito isNaN(undefined)
restituito true
. Ma se userò Number.isNaN(undefined)
sta restituendo false
. Quindi quale dovrei usare. Anche perché c'è così discrepanza nel risultato.Confusione tra isNaN e Number.isNaN in javascript
risposta
Per citare un ponyfoo article on numbers in ES6:
Number.isNaN è quasi identica a ES5 metodo isNaN globale. Number.isNaN restituisce se il valore fornito è uguale a NaN. Questa è una domanda molto diversa da da "questo non è un numero?".
Quindi isNaN
controlla solo se il valore passato non è un numero o non può essere convertito in un numero. Number.isNaN
d'altra parte controlla solo se il valore è uguale a NaN
(utilizza comunque un algoritmo diverso da ===
).
La stringa 'ponyfoo'
ad esempio non è un numero e non può essere convertita in un numero, ma non è NaN
.
Esempio:
Number.isNaN({});
// <- false, {} is not NaN
Number.isNaN('ponyfoo')
// <- false, 'ponyfoo' is not NaN
Number.isNaN(NaN)
// <- true, NaN is NaN
Number.isNaN('pony'/'foo')
// <- true, 'pony'/'foo' is NaN, NaN is NaN
isNaN({});
// <- true, {} is not a number
isNaN('ponyfoo')
// <- true, 'ponyfoo' is not a number
isNaN(NaN)
// <- true, NaN is not a number
isNaN('pony'/'foo')
// <- true, 'pony'/'foo' is NaN, NaN is not a number
isNaN
converte l'argomento di unNumber
e restituisce vero se il valore risultante èNaN
.Number.isNaN
non converte l'argomento; restituisce true quando l'argomento èNumber
ed èNaN
.
Quindi quale dovrei usare.
Sono indovinando si sta cercando di verificare se il valore è qualcosa che sembra un numero di. Nel qual caso la risposta è né. Queste funzioni controllano se il valore è un numero IEEE-754 Non un numero. Periodo. Per esempio, questo è chiaramente sbagliato:
var your_age = "";
// user forgot to put in their age
if (isNaN(your_age)) {
alert("Age is invalid. Please enter a valid number.");
} else {
alert("Your age is " + your_age + ".");
}
// alerts "Your age is ."
// same result when you use Number.isNaN above
anche perché c'è così discrepanza nel risultato.
Come spiegato sopra Number.isNaN
restituiranno falso immediatamente se l'argomento non è una Number
mentre isNaN
prima converte il valore di un Number
. Questo cambia il risultato.Alcuni esempi:
Number.isNumber() isNaN()
----------------+----------------------------+-----------------------
value | value is a Number | result | Number(value) | result
----------------+-------------------+--------+---------------+-------
undefined | false | false | NaN | true
{} | false | false | NaN | true
"blabla" | false | false | NaN | true
new Date("!") | false | false | NaN | true
new Number(0/0) | false | false | NaN | true
In breve,
isNaN()
controllerà se il convertito di valore a Number (tipo) sono riuscito
Per example'abc'
Number.isNaN()
controllerà se il dato tipo di valore è il numero, ma non numero valido
Ad esempio: 'bb'/33
ho scoperto che se si desidera controllare se qualcosa è numeroso (o non), quindi una combinazione di Number.isNaN()
con Number.parseInt()
o Number.parseFloat()
(a seconda di cosa ci si aspetta) per coprire la maggior parte dei casi d'uso:
considerano: prova di un mazzo di ingresso differente vars contro diversi è test numero:
r = [NaN, undefined, null, false, true, {}, [], '', ' ', 0, 1, '0', '1']
.map(function(v){return [
v,
isNaN(v),
Number.isNaN(v),
Number.isInteger(v),
Number.parseInt(v, 10),
Number.isNaN(Number.parseInt(v, 10))
];});
console.table(r);
// or if console.table() not available:
r.join('\n', function(v){v.join(',')});
risultato:
NaN , true , true , false, NaN, true
undefined, true , false, false, NaN, true
null , false, false, false, NaN, true
false , false, false, false, NaN, true
true , false, false, false, NaN, true
Object , true , false, false, NaN, true
Array(0) , false, false, false, NaN, true
'' , false, false, false, NaN, true
' ' , false, false, false, NaN, true
0 , false, false, true , 0 , false
1 , false, false, true , 1 , false
'0' , false, false, false, 0 , false
'1' , false, false, false, 1 , false
Nota l'ultima colonna, che di solito è quello che voglio nella mia esperienza.
** Risposta: ** 'A causa di entrambi gli operatori di uguaglianza, == e ===, la valutazione su false quando si verifica se NaN è NaN, è diventata necessaria la funzione Number.isNaN(). In confronto alla funzione globale isNaN(), Number.isNaN() non ha il problema di convertire forzatamente il parametro in un numero. Ciò significa che ora è sicuro passare valori che normalmente sarebbero convertiti in NaN, ma in realtà non hanno lo stesso valore di NaN. Ciò significa anche che solo i valori del numero di tipo, che sono anche NaN, restituiscono true. – Tushar
Correlati: [Is Number.IsNaN() è più danneggiato di isNaN()] (http://stackoverflow.com/questions/25176459/ is-number-isnan-more-broken-than-isnan) –
non lo sapeva. La maggior parte delle volte che uso isNaN() – Rudra