validate statement quitar number isnan error como javascript nan

statement - ¿Cómo verificas que un número es NaN en JavaScript?



parseint javascript (29)

Solo lo he estado probando en la consola de JavaScript de Firefox, pero ninguna de las siguientes afirmaciones devuelve verdadero:

parseFloat(''geoff'') == NaN; parseFloat(''geoff'') == Number.NaN;


¡Solución simple!

REALMENTE super simple! ¡Aquí! ¡Ten este método!

function isReallyNaN(a) { return a !== a; };

Utilice tan simple como:

if (!isReallyNaN(value)) { return doingStuff; }

Ver prueba de rendimiento aquí usando esta función vs respuesta seleccionada

También: Ver abajo 1er ejemplo para un par de implementaciones alternativas.

Ejemplo:

function isReallyNaN(a) { return a !== a; }; var example = { ''NaN'': NaN, ''an empty Objet'': {}, ''a parse to NaN'': parseFloat(''$5.32''), ''a non-empty Objet'': { a: 1, b: 2 }, ''an empty Array'': [], ''a semi-passed parse'': parseInt(''5a5''), ''a non-empty Array'': [ ''a'', ''b'', ''c'' ], ''Math to NaN'': Math.log(-1), ''an undefined object'': undefined } for (x in example) { var answer = isReallyNaN(example[x]), strAnswer = answer.toString(); $("table").append($("<tr />", { "class": strAnswer }).append($("<th />", { html: x }), $("<td />", { html: strAnswer }))) };

table { border-collapse: collapse; } th, td { border: 1px solid; padding: 2px 5px; } .true { color: red; } .false { color: green; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <table></table>

Hay un par de rutas alternativas que toma para la implementación, si no desea utilizar un método con nombre alternativo, y desea asegurarse de que esté más disponible a nivel mundial. Advertencia Estas soluciones implican alterar objetos nativos, y puede que no sean su mejor solución. Siempre tenga cuidado y tenga en cuenta que otras bibliotecas que puede usar pueden depender de código nativo o alteraciones similares.

Implementación alternativa 1: Reemplace el método nativo de isNaN .

// Extremely simple. Just simply write the method. window.isNaN = function(a) { return a !==a; }

Implementación alternativa 2: anexar al objeto numérico
* Sugerido ya que también es un relleno múltiple para ECMA 5 a 6

Number[''isNaN''] || (Number.isNaN = function(a) { return a !== a }); // Use as simple as Number.isNaN(NaN)

Prueba de solución alternativa si está vacío

Un método de ventana simple escribí esa prueba si el objeto está vacío . Es un poco diferente, ya que no da si el artículo es "exactamente" NaN , pero pensé que iba a lanzar esto, ya que también puede ser útil cuando se buscan artículos vacíos.

/** isEmpty(varried) * Simple method for testing if item is "empty" **/ ;(function() { function isEmpty(a) { return (!a || 0 >= a) || ("object" == typeof a && //{/}|/[(null(,)*)*/]/.test(JSON.stringify(a))); }; window.hasOwnProperty("empty")||(window.empty=isEmpty); })();

Ejemplo:

;(function() { function isEmpty(a) { return !a || void 0 === a || a !== a || 0 >= a || "object" == typeof a && //{/}|/[(null(,)*)*/]/.test(JSON.stringify(a)); }; window.hasOwnProperty("empty")||(window.empty=isEmpty); })(); var example = { ''NaN'': NaN, ''an empty Objet'': {}, ''a parse to NaN'': parseFloat(''$5.32''), ''a non-empty Objet'': { a: 1, b: 2 }, ''an empty Array'': new Array(), ''an empty Array w/ 9 len'': new Array(9), ''a semi-passed parse'': parseInt(''5a5''), ''a non-empty Array'': [ ''a'', ''b'', ''c'' ], ''Math to NaN'': Math.log(-1), ''an undefined object'': undefined } for (x in example) { var answer = empty(example[x]), strAnswer = answer.toString(); $("#t1").append( $("<tr />", { "class": strAnswer }).append( $("<th />", { html: x }), $("<td />", { html: strAnswer.toUpperCase() }) ) ) }; function isReallyNaN(a) { return a !== a; }; for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};

table { border-collapse: collapse; float: left; } th, td { border: 1px solid; padding: 2px 5px; } .true { color: red; } .false { color: green; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <table id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table> <table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>

Verificación extremadamente profunda si está vacío

Este último va un poco más profundo, incluso comprobando si un Objeto está lleno de Objetos en blanco. Estoy seguro de que tiene margen de mejora y posibles picaduras, pero hasta ahora, parece que atrapa casi todo.

function isEmpty(a) { if (!a || 0 >= a) return !0; if ("object" == typeof a) { var b = JSON.stringify(a).replace(/"[^"]*":(0|"0*"|false|null|/{/}|/[(null(,)?)*/]),?/g, '''').replace(/"[^"]*":/{/},?/g, ''''); if ( /^$|/{/}|/[/]/.test(b) ) return !0; else if (a instanceof Array) { b = b.replace(/(0|"0*"|false|null|/{/}|/[(null(,)?)*/]),?/g, ''''); if ( /^$|/{/}|/[/]/.test(b) ) return !0; } } return false; } window.hasOwnProperty("empty")||(window.empty=isEmpty); var example = { ''NaN'': NaN, ''an empty Objet'': {}, ''a parse to NaN'': parseFloat(''$5.32''), ''a non-empty Objet'': { a: 1, b: 2 }, ''an empty Array'': new Array(), ''an empty Array w/ 9 len'': new Array(9), ''a semi-passed parse'': parseInt(''5a5''), ''a non-empty Array'': [ ''a'', ''b'', ''c'' ], ''Math to NaN'': Math.log(-1), ''an undefined object'': undefined, ''Object Full of Empty Items'': { 1: '''', 2: [], 3: {}, 4: false, 5:new Array(3), 6: NaN, 7: null, 8: void 0, 9: 0, 10: ''0'', 11: { 6: NaN, 7: null, 8: void 0 } }, ''Array Full of Empty Items'': ["",[],{},false,[null,null,null],null,null,null,0,"0",{"6":null,"7":null}] } for (x in example) { var answer = empty(example[x]), strAnswer = answer.toString(); $("#t1").append( $("<tr />", { "class": strAnswer }).append( $("<th />", { html: x }), $("<td />", { html: strAnswer.toUpperCase() }) ) ) }; function isReallyNaN(a) { return a !== a; }; for(x in example){var answer=isReallyNaN(example[x]),strAnswer=answer.toString();$("#t2").append($("<tr />",{"class":strAnswer}).append($("<th />",{html:x}),$("<td />",{html:strAnswer.toUpperCase()})))};

table { border-collapse: collapse; float: left; } th, td { border: 1px solid; padding: 2px 5px; } .true { color: red; } .false { color: green; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <table id="t1"><thead><tr><th colspan="2">isEmpty()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table> <table id="t2"><thead><tr><th colspan="2">isReallyNaN()</th></tr></thead><thead><tr><th>Value Type</th><th>Bool Return</th></tr></thead></table>


¿Es (NaN> = 0) ? ...... " No sé ".

function IsNotNumber( i ){ if( i >= 0 ){ return false; } if( i <= 0 ){ return false; } return true; }

Las condiciones solo se ejecutan si son VERDADERAS .

No en FALSO .

No en " No sé ".


A partir de ES6 , Object.is(..) es una nueva utilidad que se puede usar para probar dos valores de igualdad absoluta:

var a = 3 / ''bar''; Object.is(a, NaN); // true


Acabo de encontrar esta técnica en el libro Effective JavaScript que es bastante simple:

Dado que NaN es el único valor de JavaScript que se trata como desigual a sí mismo, siempre puede probar si un valor es NaN al verificar que sea igual a sí mismo:

var a = NaN; a !== a; // true var b = "foo"; b !== b; // false var c = undefined; c !== c; // false var d = {}; d !== d; // false var e = { valueOf: "foo" }; e !== e; // false

No me di cuenta de esto hasta que @allsyed comentó, pero esto está en la especificación ECMA: tc39.github.io/ecma262/#sec-isnan-number


Así que veo varias respuestas a esto,

Pero yo solo uso:

function isNaN(x){ return x == x && typeof x == ''number''; }


De acuerdo con IEEE 754, todas las relaciones que involucran NaN se evalúan como falsas, excepto! =. Así, por ejemplo, (A> = B) = falso y (A <= B) = falso si A o B o ambos son NaN.


Debe usar la llamada a la función global isNaN(value) , porque:

  • Es compatible con varios navegadores
  • Ver isNaN para la documentación.

Ejemplos:

isNaN(''geoff''); // true isNaN(''3''); // false

Espero que esto ayude.


En cuanto a un valor de tipo Number va a probar si es un NaN o no, la función global isNaN hará el trabajo

isNaN(any-Number);

Para un enfoque genérico que funcione para todos los tipos en JS, podemos usar cualquiera de los siguientes:

Para usuarios de ECMAScript-5:

#1 if(x !== x) { console.info(''x is NaN.''); } else { console.info(''x is NOT a NaN.''); }

Para las personas que usan ECMAScript-6:

#2 Number.isNaN(x);

Y para propósitos de coherencia en ECMAScript 5 y 6, también podemos usar este polyfill para Number.isNan

#3 //Polyfill from MDN Number.isNaN = Number.isNaN || function(value) { return typeof value === "number" && isNaN(value); } // Or Number.isNaN = Number.isNaN || function(value) { return value !== value; }

por favor revise esta respuesta para más detalles.


Encontré otra manera, sólo por diversión.

function IsActuallyNaN(obj) { return [obj].includes(NaN); }


He creado esta pequeña función que funciona como un encanto. En lugar de verificar el NaN, que parece ser contrario a la intuición, verifica un número. Estoy bastante seguro de que no soy el primero en hacerlo de esta manera, pero pensé que lo compartiría.

function isNum(val){ var absVal = Math.abs(val); var retval = false; if((absVal-absVal) == 0){ retval = true } return retval; }


La forma exacta de comprobar es:

//takes care of boolen, undefined and empty isNaN(x) || typeof(x) ===''boolean'' || typeof(x) !==''undefined'' || x!=='''' ? ''is really a nan'' : ''is a number''


La respuesta de marksyzm funciona bien, pero no devuelve falso para Infinity ya que Infinity no es técnicamente un número.

Se me ocurrió una función isNumber que verificará si es un número.

function isNumber(i) { return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY].indexOf(i) === -1; } console.log(isNumber(Infinity)); console.log(isNumber("asdf")); console.log(isNumber(1.4)); console.log(isNumber(NaN)); console.log(isNumber(Number.MAX_VALUE)); console.log(isNumber("1.68"));

ACTUALIZACIÓN: noté que este código falla para algunos parámetros, así que lo mejoré.

function isNumber(i) {//function for checking if parameter is number if(!arguments.length) { throw new SyntaxError("not enough arguments."); } else if(arguments.length > 1) { throw new SyntaxError("too many arguments."); } else if([Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY].indexOf(i) !== -1) { throw new RangeError("number cannot be /xB1infinity."); } else if(typeof i === "object" && !(i instanceof RegExp) && !(i instanceof Number) && !(i === null)) { throw new TypeError("parameter cannot be object/array."); } else if(i instanceof RegExp) { throw new TypeError("parameter cannot be RegExp."); } else if(i == null || i === undefined) { throw new ReferenceError("parameter is null or undefined."); } else { return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && (i === i); } } console.log(isNumber(Infinity)); console.log(isNumber(this)); console.log(isNumber(/./ig)); console.log(isNumber(null));


NaN en JavaScript significa "No es un número", aunque su tipo es en realidad número.

typeof(NaN) // "number"

Para verificar si una variable es de valor NaN, no podemos simplemente usar la función isNaN (), ya que isNaN () tiene el siguiente problema, vea a continuación:

var myVar = "A"; isNaN(myVar) // true, although "A" is not really of value NaN

Lo que realmente sucede aquí es que myVar se obliga implícitamente a un número:

var myVar = "A"; isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact

Realmente tiene sentido, porque "A" en realidad no es un número. Pero lo que realmente queremos comprobar es si myVar es exactamente de valor NaN.

Así que isNaN () no puede ayudar. Entonces, ¿qué debemos hacer en su lugar?

A la luz de que NaN es el único valor de JavaScript que se trata de manera desigual a sí mismo, por lo que podemos verificar su igualdad utilizando el mismo ==

var myVar; // undefined myVar !== myVar // false var myVar = "A"; myVar !== myVar // false var myVar = NaN myVar !== myVar // true

Entonces, para concluir , si es cierto que una variable! == en sí misma, entonces esta variable es exactamente de valor NaN:

function isOfValueNaN(v) { return v !== v; } var myVar = "A"; isNaN(myVar); // true isOfValueNaN(myVar); // false


NaN es un valor especial que no puede ser probado de esa manera. Una cosa interesante que solo quería compartir es esto

var nanValue = NaN; if(nanValue !== nanValue) // Returns true! alert(''nanValue is NaN'');

Esto devuelve verdadero solo para los valores de NaN y es una forma segura de prueba. Definitivamente debería estar envuelto en una función o al menos comentado, porque obviamente no tiene mucho sentido probar si la misma variable no es igual a otra, jeje.


Otra solución se menciona en la página parseFloat de MDN.

Proporciona una función de filtro para hacer un análisis estricto.

var filterFloat = function (value) { if(/^(/-|/+)?([0-9]+(/.[0-9]+)?|Infinity)$/ .test(value)) return Number(value); return NaN; } console.log(filterFloat(''421'')); // 421 console.log(filterFloat(''-421'')); // -421 console.log(filterFloat(''+421'')); // 421 console.log(filterFloat(''Infinity'')); // Infinity console.log(filterFloat(''1.61803398875'')); // 1.61803398875 console.log(filterFloat(''421e+0'')); // NaN console.log(filterFloat(''421hop'')); // NaN console.log(filterFloat(''hop1.61803398875'')); // NaN

Y luego puedes usar isNaN para verificar si es NaN


Para solucionar el problema donde se analiza ''1.2geoff'' , simplemente use el analizador Number() lugar.

Así que en lugar de esto:

parseFloat(''1.2geoff''); // => 1.2 isNaN(parseFloat(''1.2geoff'')); // => false isNaN(parseFloat(''.2geoff'')); // => false isNaN(parseFloat(''geoff'')); // => true

Hacer esto:

Number(''1.2geoff''); // => NaN isNaN(Number(''1.2geoff'')); // => true isNaN(Number(''.2geoff'')); // => true isNaN(Number(''geoff'')); // => true

EDITAR: Acabo de notar otro problema de esto, sin embargo ... los valores falsos (y verdaderos como un booleano real) pasaron a Number() devuelto como 0 En cuyo caso ... parseFloat funciona cada vez en su lugar. Así que vuelve a eso:

function definitelyNaN (val) { return isNaN(val && val !== true ? Number(val) : parseFloat(val)); }

Y eso cubre aparentemente todo. Lo comparé en un 90% más lento que el _.isNaN de _.isNaN pero ese no cubre todos los NaN:

http://jsperf.com/own-isnan-vs-underscore-lodash-isnan

Para que quede claro, el mío se encarga de la interpretación literal humana de algo que no es "un número" y la de lodash se encarga de la interpretación literal de la computadora de verificar si algo es "NaN".


Parece que isNaN () no es compatible con Node.js fuera de la caja.
Trabajé alrededor de

var value = 1; if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);



Quizás también esto:

function isNaNCustom(value){ return value.toString() === ''NaN'' && typeof value !== ''string'' && typeof value === ''number'' }


Si bien la respuesta de @chiborg ES correcta, hay algo más que debe tenerse en cuenta:

parseFloat(''1.2geoff''); // => 1.2 isNaN(parseFloat(''1.2geoff'')); // => false isNaN(parseFloat(''.2geoff'')); // => false isNaN(parseFloat(''geoff'')); // => true

El punto es que, si está utilizando este método para la validación de la entrada, el resultado será más bien liberal.

Entonces, sí, puede usar parseFloat(string) (o en el caso de los números completos parseInt(string, radix) ''y luego envolver eso con isNaN() , pero tenga en cuenta el gotcha con números entrelazados con caracteres no numéricos adicionales .


Simplemente convierta el resultado a String y compárelo con ''NaN''.

var val = Number("test"); if(String(val) === ''NaN'') { console.log("true"); }


Solo quiero compartir otra alternativa, no es necesariamente mejor que otras aquí, pero creo que vale la pena mirar:

function customIsNaN(x) { return (typeof x == ''number'' && x != 0 && !x); }

La lógica detrás de esto es que todos los números excepto 0 y NaN se NaN en true .

He hecho una prueba rápida, y funciona tan bien como Number.isNaN y como comprobado contra sí mismo por falso. Los tres funcionan mejor que isNan

Los resultados

customIsNaN(NaN); // true customIsNaN(0/0); // true customIsNaN(+new Date(''?'')); // true customIsNaN(0); // false customIsNaN(false); // false customIsNaN(null); // false customIsNaN(undefined); // false customIsNaN({}); // false customIsNaN(''''); // false

Puede ser útil si desea evitar la función isNaN rota.


Usa este código:

isNaN(''geoff'');

Consulte la documentación de isNaN() en MDN .

alert ( isNaN(''abcd'')); // alerts true alert ( isNaN(''2.0'')); // alerts false alert ( isNaN(2.0)); // alerts false


Yo uso la función isNaN de guión isNaN porque en JavaScript:

isNaN(undefined) -> true

Por lo menos, ten en cuenta que tienes gotcha.


Escribí esta respuesta a otra pregunta en donde otra verifica cuando NaN == null pero luego se marcó como duplicado, por lo que no quiero desperdiciar mi trabajo.

Mire la Red de Desarrolladores de Mozilla sobre NaN .

Respuesta corta

Solo usa la distance || 0 distance || 0 cuando quiere asegurarse de que el valor es un número correcto o isNaN() para verificarlo.

Respuesta larga

El NaN (Not-a-Number) es un objeto global raro en javascript que se devuelve con frecuencia cuando falla una operación matemática.

Quería comprobar si NaN == null que resulta false . Hovewer incluso NaN == NaN resultados con false .

Una forma sencilla de averiguar si la variable es NaN es una función global isNaN() .

Otra es x !== x que solo es verdadera cuando x es NaN. (Gracias por recordar a @ raphael-schweikert)

Pero ¿por qué funcionó la respuesta corta?

Vamos a averiguar.

Cuando llama a NaN == false el resultado es false , igual que NaN == true .

En algún lugar de las especificaciones, JavaScript tiene un registro con valores siempre falsos, que incluye:

  • NaN - No es un número
  • "" - cadena vacía
  • false - un falso booleano
  • null - objeto nulo
  • undefined - variables indefinidas
  • 0 - 0 numérico, incluyendo +0 y -0


function isNotANumber(n) { if (typeof n !== ''number'') { return true; } return n !== n; }



alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);

Esto no es elegante. pero después de probar isNAN () llegué a esta solución, que es otra alternativa. En este ejemplo también permití ''.'' porque estoy enmascarando para flotar. También puede revertir esto para asegurarse de que no se usen números.

("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)

Esta es una evaluación de un solo carácter, pero también puede recorrer una cadena para verificar cualquier número.