Solo por curiosidad.
No parece muy lógico que typeof NaN
sea número. Solo como NaN === NaN
o NaN == NaN
devolviendo falso, por cierto. ¿Es esta una de las peculiaridades de javascript, o habría una razón para esto?
Editar: gracias por sus respuestas. Sin embargo, no es una cosa fácil tener la cabeza puesta. Leyendo respuestas y la wiki entendí más, pero aún así, una oración como
Una comparación con un NaN siempre devuelve un resultado desordenado, incluso cuando se compara con sí mismo. Los predicados de comparación son señalización o no señalización, las versiones de señalización señalan una excepción no válida para tales comparaciones. Los predicados de igualdad y desigualdad no son señalización, por lo que x = x devuelve falso se puede utilizar para probar si x es un NaN silencioso.
solo mantiene mi cabeza girando. Si alguien puede traducir esto en lenguaje legible para humanos (en lugar de, digamos, matemático), estaría agradecido.
fuente
isNumeric
verificar el tipo:$.isNumeric(NaN);
devuelve falso, donde como$.type(NaN);
, devuelve el número. api.jquery.com/jQuery.isNumericRespuestas:
Significa no un número. No es una peculiaridad de javascript, sino un principio informático común.
De http://en.wikipedia.org/wiki/NaN :
Todos estos valores pueden no ser iguales. Una prueba simple para un NaN es probar que
value == value
es falso.fuente
isNaN(value)
isNaN(undefined)
vuelvetrue
, peroundefined == undefined
también es cierto. Lo mismo ocurre con todos los demás tipos que no son números, exceptonull
.value !== value
es probablemente la forma más corta de probar sivalue
es realmenteNaN
.Bueno,
NaN
sigue siendo un tipo numérico , a pesar del hecho de que en realidad significa Not-A-Number :-)NaN
solo significa que el valor específico no se puede representar dentro de las limitaciones del tipo numérico (aunque eso podría decirse de todos los números que deben redondearse para ajustarse, peroNaN
es un caso especial).Un específico
NaN
no se considera igual a otroNaN
porque pueden ser valores diferentes. Sin embargo,NaN
sigue siendo un tipo de número, al igual que 2718 o 31415.En cuanto a su pregunta actualizada para explicar en términos simples:
Todo esto significa es (desglosado en partes):
Básicamente, a
NaN
no es igual a ningún otro número, incluido otroNaN
, e incluso a sí mismo .Intentar realizar operaciones de comparación (menor que, mayor que, y así sucesivamente) entre un
NaN
número y otro puede provocar una excepción (señalización) o simplemente obtener un resultado falso (no señalización o silencio).Las pruebas de igualdad (igual a, no igual a) nunca son una señal, por lo que su uso no causará una excepción. Si tiene un número regular
x
,x == x
siempre será cierto. Six
es aNaN
,x == x
siempre será falso. Le está dando una manera de detectarNaN
fácilmente (en silencio).fuente
typeof a === 'number'
significa "a se almacena internamente como un flotador IEEE 754"Infinity === Infinity
regresatrue
si unInfinity
puede ser producido por diferentes valores: 1.0 / 0.0 o 2.0 / 0.0?1/0
y estoy2/0
en la misma clase y (2) solo hay una clase de infinito en IEEE754 (aparte de,+/-
por supuesto).0/0
no se definen de manera significativa, aparte de decir que su "valor" es todo el conjunto de números E incluso si se definieron,Math.log(-1) == Math.log(-1)
aún se evalúafalse
. Por lo tanto, no solo no hay "números reales",NaN
sino que incluso si los hubiera, no se usaron para la comparación.El estándar ECMAScript (JavaScript) especifica que
Numbers
son flotantes IEEE 754 , que incluyenNaN
como un posible valor.fuente
typeof NaN
regresa'number'
porque:La especificación ECMAScript dice que el tipo de número incluye NaN:
Entonces
typeof
vuelve en consecuencia:Este comportamiento está de acuerdo con el estándar IEEE para aritmética de punto flotante (IEEE 754) :
fuente
NaN es un valor de coma flotante válido ( http://en.wikipedia.org/wiki/NaN )
y NaN === NaN es falso porque no son necesariamente el mismo no número
fuente
Infinity
s de alguna manera son idénticos? ¿Alguna idea?NaN != NaN
porque no son necesarios el MISMO no número. Por lo tanto, tiene mucho sentido ... También por qué los flotadores tienen +0.00 y -0.00 que no son lo mismo. El redondeo puede hacer que en realidad no sean cero.En cuanto a typeof, eso depende del idioma. Y la mayoría de los idiomas dirán que NaN es flotante, doble o número dependiendo de cómo lo clasifiquen ... No conozco ningún idioma que diga que este es un tipo desconocido o nulo.
fuente
number
,NaN
es primitivo y, por lo tanto, está determinado únicamente por su valor.NaN
significa No es un número . Es un valor de tipos de datos numéricos (generalmente tipos de punto flotante, pero no siempre) que representa el resultado de una operación no válida, como dividir por cero.Aunque sus nombres dicen que no es un número, el tipo de datos utilizado para contenerlo es un tipo numérico. Entonces, en JavaScript,
NaN
volverá a solicitar el tipo de datos denumber
(comoalert(typeof(NaN))
lo demuestra claramente).fuente
Infinity
noNaN
Javascript usa NaN para representar cualquier cosa que encuentre que no pueda ser representada de otra manera por sus especificaciones. No significa que no sea un número. Es la forma más fácil de describir el encuentro. NaN significa que él o un objeto que se refiere a él no podría ser representado de otra manera por javascript. A todos los efectos prácticos, es "desconocido". Siendo 'desconocido' no puede decirte qué es ni siquiera si es en sí mismo. Ni siquiera es el objeto al que está asignado. Solo puede decirte lo que no es, y la nada o la nada solo pueden describirse matemáticamente en un lenguaje de programación. Como las matemáticas son números, JavaScript representa la nada como NaN. Eso no significa que no sea un número. Significa que no podemos leerlo de otra manera que tenga sentido. Por eso puede ' t incluso igual a sí mismo. Porque no lo hace.
fuente
Un mejor nombre para
NaN
, describiendo su significado de manera más precisa y menos confusa, sería una excepción numérica . Realmente es otro tipo de objeto de excepción disfrazado de tipo primitivo (por el diseño del lenguaje), donde al mismo tiempo no se trata como primitivo en su falsa auto-comparación. De ahí la confusión. Y mientras el lenguaje "no decida" elegir entre un objeto de excepción apropiado y un número primitivo , la confusión se mantendrá.La infame no igualdad de
NaN
sí mismo, ambos==
y===
es una manifestación del diseño confuso que obliga a este objeto de excepción a ser un tipo primitivo. Esto rompe el principio fundamental de que una primitiva está determinada únicamente por su valor . SiNaN
se prefiere ser visto como una excepción (de los cuales puede haber diferentes tipos), entonces no debe "venderse" como primitivo. Y si se quiere ser primitivo, ese principio debe mantenerse. Mientras esté roto, como lo hemos hecho en JavaScript, y realmente no podemos decidir entre los dos, la confusión que conduce a una carga cognitiva innecesaria para todos los involucrados seguirá siendo. Lo cual, sin embargo, es realmente fácil de solucionar simplemente haciendo la elección entre los dos:NaN
un objeto de excepción especial que contenga la información útil sobre cómo surgió la excepción, en lugar de desechar esa información como lo que está implementado actualmente, lo que lleva a un código más difícil de depurar;NaN
una entidad del tipo primitivonumber
(que podría llamarse menos confusamente "numérico"), en cuyo caso debería ser igual a sí mismo y no puede contener ninguna otra información; esta última es claramente una elección inferior.La ventaja sólo es concebible de forzar
NaN
alnumber
tipo es ser capaz de tirar de nuevo en cualquier expresión numérica. Lo que, sin embargo, lo convierte en una opción frágil, porque el resultado de cualquier expresión numérica que contengaNaN
seráNaN
, o dará lugar a resultados impredecibles, comoNaN < 0
evaluar afalse
, es decir, regresar enboolean
lugar de mantener la excepción.E incluso si "las cosas son como son", nada nos impide hacer esa distinción clara para nosotros mismos, para ayudar a que nuestro código sea más predecible y más fácil de depurar. En la práctica, eso significa identificar esas excepciones y tratarlas como excepciones. Lo cual, desafortunadamente, significa más código, pero con suerte será mitigado por herramientas como TypeScript de Flowtype.
Y luego tenemos la distinción de señalización
NaN
desordenada silenciosa vs ruidosa . Lo que realmente se trata de cómo se manejan las excepciones, no las excepciones en sí mismas, y nada diferente de otras excepciones.Del mismo modo,
Infinity
y+Infinity
son elementos de tipo numérico que surgen en la extensión de la línea real pero no son números reales. Matemáticamente, se pueden representar mediante secuencias de números reales que convergen a cualquiera+
o-Infinity
.fuente
Esto es simplemente porque
NaN
es una propiedad del objeto Number en JS, no tiene nada que ver con que sea un número.fuente
Number.fu = "bar"; alert(typeof Number.fu);
NaN
no es el valor almacenadoNumber.NaN
, sea lo que sea.NaN
es un valor primitivo de tipo Número. Y además, el valor deNumber.NaN
esNaN
, pero eso no está relacionado.La mejor manera de pensar en NAN es que no es un número conocido . Es por eso que NAN! = NAN porque cada valor NAN representa un número único desconocido. Las NAN son necesarias porque los números de coma flotante tienen un rango limitado de valores. En algunos casos, el redondeo se produce cuando se pierden los bits más bajos, lo que conduce a lo que parece ser una tontería como 1.0 / 11 * 11! = 1.0. Los valores realmente grandes que son mayores son NAN con infinito como un ejemplo perfecto.
Dado que solo tenemos diez dedos, cualquier intento de mostrar valores mayores que 10 es imposible, lo que significa que tales valores deben ser NAN porque hemos perdido el verdadero valor de este valor mayor que 10. Lo mismo se aplica a los valores de coma flotante, donde el valor excede los límites de lo que puede mantenerse en un flotador.
fuente
Porque NaN es un tipo de datos numéricos.
fuente
NaN
es un número desde un punto de vista de tipo, pero no es un número normal como 1, 2 o 329131. El nombre "No es un número" se refiere al hecho de que el valor representado es especial y se trata del dominio de especificaciones de formato IEEE, no dominio de lenguaje javascript.fuente
Si usa jQuery, prefiero
isNumeric
verificar el tipo:http://api.jquery.com/jQuery.isNumeric/
fuente
isNumber
delutil
paquete de imprenta. Bien, que todavía usamosjQuery
en nuestro proyecto, así que usé su sugerencia en su lugar.isNumber
fromutil
de mecanografiado también devuelvetrue
paraNaN
.Javascript tiene solo un tipo de datos numéricos, que es el flotante estándar de doble precisión de 64 bits. Todo es un doble. NaN es un valor especial de doble, pero no obstante es doble.
Todo lo que
parseInt
hace es "convertir" su cadena en un tipo de datos numéricos, por lo que el resultado es siempre "número"; solo si la cadena original no se podía analizar, su valor será NaN.fuente
NaN sigue siendo un tipo numérico, pero representa un valor que no podría representar un número válido.
fuente
Podríamos argumentar que NaN es un objeto de caso especial. En este caso, el objeto de NaN representa un número que no tiene sentido matemático. Hay otros objetos de casos especiales en matemáticas como INFINITE, etc.
Todavía puede hacer algunos cálculos con él, pero eso generará comportamientos extraños.
Más información aquí: http://www.concentric.net/~ttwang/tech/javafloat.htm (basado en java, no javascript)
fuente
Tienes que amar Javascript. Tiene algunas pequeñas peculiaridades interesantes.
http://wtfjs.com/page/13
La mayoría de esas peculiaridades se pueden explicar si se detiene para resolverlas de manera lógica, o si sabe un poco sobre teoría de números, pero aún así pueden atraparlo si no las conoce.
Por cierto, recomiendo leer el resto de http://wtfjs.com/ - ¡hay muchas peculiaridades más interesantes que esta!
fuente
El valor NaN es realmente el Número. Por lo tanto, cuando pregunte si es un número, dirá que sí. Hizo lo correcto al usar la llamada isNaN ().
Para información, NaN también puede ser devuelto por operaciones en Números que no están definidos como divisiones por cero o raíz cuadrada de un número negativo.
fuente
NaN == Number.NaN
evalúa afalse
!NaN==NaN
ser estúpidofalse
, debe haber sido un sádico que inventó eso para hacer sufrir a todos.Un ejemplo
Imagina que estamos convirtiendo una cadena en un número:
¡Cambiamos el tipo de datos a número pero su valor no es un número!
fuente
NaN
es del tipo de número . La pregunta es por qué.Es un valor especial de tipo de número como POSITIVE_INFINITY
¿Por qué? Por diseño
fuente