2010-07-09 13 views
23

Tengo un fragmento de código JavaScript que se espera que establezca un valor entero para una variable.¿Por qué JavaScript dice que un número no es un número?

Algo está roto, así que cuando intento hacer alert(A);, devuelve NaN. isNaN(A); devuelve verdadero. Pero si yo alert(typeof(A));, dice number.

Entonces, ¿cómo puede una variable ser un número y no un número al mismo tiempo? ¿Tal vez entendí mal lo que NaN realmente es?


Editar: gracias a las respuestas, veo que estaba equivocado, porque:

  • El tipo de NaN es Number,
  • NaN significa "No es un número", que no es lo mismo que "no del tipo Number",
  • 0/0 es un buen ejemplo de NaN: sigue siendo un número, pero JavaScript (y nadie más) puede decir cuál es el valor real de cero dividido entre cero. 1/0 por el contrario devuelve Infinity, que no es NaN.
+4

¿Puede dar más detalles acerca de cómo se declara Ã? Amor – Shaded

+2

este post, muy divertido :) – Christian

+1

Para resumir, 'isNaN' es un número :) –

Respuesta

19

Según tengo entendido, NaN es una instancia centinela de la clase Number que representa, bueno, exactamente lo que representa: resultados numéricos que no se pueden representar adecuadamente. Por lo tanto, 0/0 no es un número, en el sentido de que es NaN, pero es a Number en términos de su tipo.

Quizás debería haberse llamado NaRN (No es un número representable).

+0

En realidad, el tipo de "NaN" es número, por poco sentido que tenga. Los números no representables son "Infinito", no "NaN", aunque nunca he visto el valor de Infinito en el código real. –

+2

'1/0' es' Infinity', y 'Infinity' no es' NaN'. Pero veo la respuesta a mi pregunta. No entendí que 'NaN' significa, como usted dice, 'resultados numéricos que no pueden representarse adecuadamente', y no 'no de tipo' Número' ". –

+0

0/0 produce NaN. Todas las demás instancias de división por cero producen +/- Infinito. –

13

Si tiene una variable y le asigna el resultado de 0/0, la variable sigue siendo de tipo numérico, pero el valor no está definido (no es un número). Hay otras condiciones bajo las cuales esto puede ocurrir, pero esto ilustra lo que está viendo.

+2

¿Seguro división por cero resultados en NaN y no en Inf? Creo que 0/0 resulta en NaN y trata de analizar una cadena que no representa un número. –

+0

tipo de NaN == 'número'. Es por eso que parece ser de tipo numérico –

+0

@inflagranti - Yo había supuesto que la división por cero estaría representada por NaN, pero aparentemente no. Mi maestra de primaria estaría realmente sorprendida por esto: http://en.wikipedia.org/wiki/Division_by_zero – tvanfosson

1

Usted está confundiendo el tipo de su objeto con el valor . NaN es un valor específico al que se puede asignar un objeto de tipo number, por ejemplo en el caso de la división de cero por cero o cuando se intenta convertir un número de una cadena que no representa un número.

+0

Gracias. Entiendo. Y sí, '0/0' es' NaN' (al contrario de '1/0'). –

0

Junto con lo que he dicho, creo que si divide por ejemplo una cuerda. Intenta devolver NaN pero aún lo ve como un número.

0

Debe consultar the Wikipedia article. Tiene más detalles.

+0

Agregar unos pocos bits relevantes a esta respuesta lo haría aún mejor. –

1

Algunas definiciones de W3Schools:

Infinity: un valor numérico que representa el infinito positivo/negativo

La propiedad POSITIVE_INFINITY representa el infinito, regresaron el desbordamiento. NEGATIVE_INFINITY, representa el infinito negativo (devuelto al desbordamiento).

propiedad El NaN representa el valor "not-a-Number". Esta propiedad indica que un valor no es un número legal.

La función isFinite() determina si un número es un número finito, legal. Esta función devuelve falso si el valor es + infinito, -infinito o NaN.

Algunas pruebas:

var n1 = 1/0; 
    var n2 = 0/0; 
    var n3 = (Number.MAX_VALUE)*2; //overflow 

    var b1 = Number.POSITIVE_INFINITY == n1; 
    var b2 = Number.POSITIVE_INFINITY == n2; 
    var b2n = Number.NEGATIVE_INFINITY == n2; 
    var b3 = Number.POSITIVE_INFINITY == n3; 

    var msg = "n1=" + n1 + ", n2=" + n2 + ", n3=" + n3; 

    msg += "<br/> n1 Is POSITIVE_INFINITY=" + b1; 
    msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2; 
    msg += "<br/> n2 Is POSITIVE_INFINITY=" + b2n; 
    msg += "<br/> n3 Is POSITIVE_INFINITY=" + b3; 

    msg += "<br/> n1 IsFinite=" + isFinite(n1); 
    msg += "<br/> n2 IsFinite=" + isFinite(n2); 
    msg += "<br/> n3 IsFinite=" + isFinite(n3); 


    msg += "<br/> n1 + n1 =" + (n1 + n1) ; 
    msg += "<br/> n1 - n1 =" + (n1 - n1) ; 
    msg += "<br/> n2 + n1 =" + (n2 + n1) ; 

    document.write(msg); 

Espectáculos

n1=Infinity, n2=NaN, n3=Infinity 
n1 Is POSITIVE_INFINITY=true 
n2 Is POSITIVE_INFINITY=false 
n2 Is POSITIVE_INFINITY=false 
n3 Is POSITIVE_INFINITY=true 
n1 IsFinite=false 
n2 IsFinite=false 
n3 IsFinite=false 
n1 + n1 =Infinity 
n1 - n1 =NaN 
n1 - n1 =NaN 
+0

JavaScript tiene un comportamiento realmente extraño cuando se trata de desbordamientos. Nunca pensé que '(Number.MAX_VALUE) * 2' daría' Infinity'. –

+0

¿Por qué es eso extraño? ECMA-262 rev 3 sec 11.6.3 dice: "En los casos restantes, donde ni un infinito, ni un cero, ni NaN está involucrado, y los operandos tienen el mismo signo o tienen diferentes magnitudes, la suma se calcula y redondea a el valor representable más cercano utilizando el modo IEEE 754 redondeado a más cercano. ** Si la magnitud es demasiado grande para representar, la operación se desborda y el resultado es una infinidad de signo apropiado. ** El lenguaje ECMAScript requiere soporte de subdesbordamiento según lo definido por IEEE 754. " (mi énfasis) –

+0

(eso fue para agregar, pero 11.5.1 dice lo mismo acerca de la multiplicación) –

Cuestiones relacionadas