2012-04-10 19 views
5

¿Cómo puedo verificar si el valor de entrada es NaN o no, sin usar la función isNaN?¿Cómo saber si el valor es NaN sin usar isNaN, que tiene falsos positivos?

+1

¿Por qué necesitaría esto? Además, esta es una demanda muy "dame el codez", así que ... no, no ayudaremos. –

+8

Tengo un tornillo que necesito atornillar, pero no quiero usar un destornillador. No, no te diré por qué no usaré un destornillador. Avísame, gracias. – asawyer

+0

¿Es esta tarea? No puedo pensar en ninguna otra razón por la que quieras asignar un rol a una función 'isNaN'. – JaredPar

Respuesta

7

Si puede utilizar ECMAScript 6, tiene Object.is:

return Object.is(obj, NaN); 

De lo contrario, aquí es una opción, a partir del código fuente de underscore.js:

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

También su nota para que función:

Nota: esto no es lo mismo que la función isNaN nativa, que también devolverá verdadero si la variable no está definida.

+0

'isNaN ('0') === falso', mientras' '_.isNaN ('0')' es verdadero. –

+0

'isNaN ('as')' es 'true', pero' _.isNaN ('as') 'es' falso'. –

+0

@RobW ¿En qué? Eso es un error por especificación. Por especificación, lo único que no es estrictamente igual a sí mismo es NaN. – gsnedders

1

convertir la entrada a un número, y comprobar si la sustracción no es cero:

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

¿Qué pasa con 'x = Infinity'? – Kobi

+0

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

+1

@Kobi 'isNaN (Infinito)' devuelve 'falso', y mi método devuelve verdadero. Infinity no es un [número real] (https://secure.wikimedia.org/wikipedia/en/wiki/Real_number), así que creo que mi implementación es mejor (no dude en disputarme). –

Cuestiones relacionadas