2013-03-02 8 views
7

Preso dalla fonte underscore.js:comprensione di sottolineatura del isNaN

_.isNaN = function(obj) { 
    return _.isNumber(obj) && obj != +obj; 
}; 

Perché l'hanno fatto in questo modo? L'implementazione sopra è equivalente a:

_.isNaN = function(obj) { 
    return obj !== obj; 
}; 

Se è così, perché la versione "più complicata"? Se non lo è, quali sono le differenze comportamentali?

+0

Or ancora più semplice, la funzione nativa 'isNaN' ... –

+2

@Kolink tratto dai documenti Underscore:" Nota: questa non è la stessa cosa della funzione nativa isNaN, che restituirà anche true se la variabile non è definita " – robertklep

+1

@Kolink' isNaN (undefined) 'restituisce true. –

risposta

4

_.isNaN(new Number(NaN)) restituisce true.

E questo è by design.

var n = new Number(NaN); 
console.log(_.isNaN(n), n!==n); // logs true, false 
+1

Così '' Number.isNaN() 'al giorno d'oggi. – Pointy

+0

@Pointy 'Number.isNaN (nuovo numero (NaN))' restituisce 'false' come di Chrome 26.0.1410.65 e FireFox 21 – Andbdrew

+0

@Andbdrew sì questo è ciò che intendevo -' Number.isNaN() 'restituisce true solo quando il suo argomento è di tipo primitivo 'numero' (non 'numero'), ed è la costante 'NaN' speciale. – Pointy

1

L'ambiente host (ad esempio l'ambiente del browser Web) può introdurre altri valori che non sono uguali a se stessi. La parte _.isNumber(obj) si assicura che l'input sia un valore Numero, in modo che _.isNaN restituisca solo true se viene passato il valore NaN.

+1

Hai un esempio di un ambiente host che introduce un valore che non è uguale a se stesso? – Randomblue

+0

@Randomblue Nope. Non ho mai sentito parlare di un tale valore, quindi il * maggio *. –

+0

Ok. Pensando bene però, che in teoria l'ambiente ospite mette tutte le scommesse fuori. – Randomblue

0

Se + è preceduto da qualsiasi valore senza valore precedente a +, il motore JavaScript proverà a convertire tale variabile in Numero. Se è valido, fornirà il Numero altrimenti restituirà NaN. Ad esempio

+ "1" // is equal to integer value 1 
+ "a1" // will be NaN because "a1" is not a valid number 

Nel caso sopra

+"a1" != "a1" // true, so this is not a number, one case is satisfied 
+"1" == "1" // true, so it is number 

altro caso semplice sarebbe, perché l'espressione sotto dare questa uscita

console.log("Why I am " + typeof + ""); 
// returns "Why I am number" 

Poiché + "" è 0.

Se si desidera verificare se si tratta di un numero o meno è possibile utilizzare la funzione di seguito

function isNumber(a){ 
    /* first method : */ return (+a == a); 
    /* second method : */ return (+(+a) >= 0); 
    // And so many other exists 
} 

Qualcuno mi corregga se sbaglio da qualche parte ..

+0

Non ci sono numeri interi in JavaScript. '+" 1.5e-1 "' – Bergi

+0

@Bergi La funzione sopra riportata fallisce con + "1.5e-1"?. E sì, l'intero invece di Number è Typo .. Sono d'accordo .. Come si chiama 0.1 in javaScript ..? – Exception

+0

No, ma '0.15' è un esempio per un numero intero non intero * semplice :-) – Bergi

0

ho trovato un caso per _.isNaN Essa mostra risultato diverso con quello nativo se ci passa un oggetto

_.isNaN({}) => false 
//but 
isNaN({}) => true