2012-04-10 3 views
5

Come posso verificare se il valore di input è NaN o meno senza utilizzare la funzione isNaN?Come stabilire se il valore è NaN senza utilizzare isNaN, che ha falsi positivi?

+1

Perché si bisogno di questo? Inoltre, questa è una domanda molto "dammi il codez", quindi ... no, non ti aiuteremo. –

+8

Ho una vite che ho bisogno di avvitare, ma non voglio usare un cacciavite. No, non ti dirò perché non userò un cacciavite. Fammi sapere, grazie. – asawyer

+0

Questi compiti? Non riesco a pensare ad alcun'altra ragione per cui vorresti assegnare un ruolo alla funzione 'isNaN'. – JaredPar

risposta

7

Se è possibile utilizzare ECMAScript 6, hai Object.is:

return Object.is(obj, NaN); 

In caso contrario, qui è un'opzione, dal codice sorgente di underscore.js:

// Is the given value `NaN`? 
_.isNaN = function(obj) { 
    // `NaN` is the only value for which `===` is not reflexive. 
    return obj !== obj; 
}; 

anche la loro nota per quella funzione:

Nota: questa non è la stessa cosa della funzione nativa isNaN, che restituirà anche true se la variabile non è definita.

+0

'isNaN ('0') === false', mentre' _.isNaN ('0') 'è vero. –

+0

'isNaN ('as')' è 'true', ma' _.isNaN ('as') 'è' false'. –

+0

@RobW In cosa? Questo è un bug per spec. Per spec. L'unica cosa non strettamente uguale a se stessa è NaN. – gsnedders

1

Convert l'ingresso ad un numero, e verificare se la sottrazione non è zero:

var x = 'value'; 
var is_NaN = +x - x !== 0; // The + is actually not needed, but added to show 
          // that a number conversion is made. 
+0

Che dire di 'x = Infinity'? – Kobi

+0

@Kobi: 'Infinity-Infinity' è' NaN' :-P –

+1

@Kobi 'isNaN (Infinity)' restituisce 'false', e il mio metodo restituisce true. Infinity non è un [numero reale] (https://secure.wikimedia.org/wikipedia/en/wiki/Real_number), quindi credo che la mia implementazione sia migliore (non esitate a contestare me). –