2015-10-16 12 views
5

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

+3

** 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

+0

Correlati: [Is Number.IsNaN() è più danneggiato di isNaN()] (http://stackoverflow.com/questions/25176459/ is-number-isnan-more-broken-than-isnan) –

+0

non lo sapeva. La maggior parte delle volte che uso isNaN() – Rudra

risposta

11

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 
1
  • isNaN converte l'argomento di un Number 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 è . 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 
0

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

2

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.