ES6: Por fin NaN será estrictamente igual que NaN

js_nan_meme-320x200

¿Quien no se ha metido alguna vez con el pobre JavaScript? ¿Quién no ha disfrutado entrando en los misterios del lenguaje y ha demostrado a sus colegas de profesión que JavaScript huele un poco a lenguaje mal diseñado? Siempre he tenido la sensación que JS es como aquel pobre niño al que no dejan en paz en el colegio y en el que día tras día, para su tormento, es el centro de las risas y las burlas del resto de compañeros.

Es verídico que siempre que un desarrollador quiera meterse con JS, nos acaba enseñando la siguiente sentencia del lenguaje:

NaN === NaN;

Si en un test nos preguntaran ¿cuál es el valor devuelto por la expresión anterior? La respuesta, de la gran mayoría de desarrolladores, sería que el valor devuelto por la expresión es sin duda ‘true’ ya que un ‘Not a Number’ siempre debería ser estrictamente un ‘Not a Number‘.

Sin embargo, en JavaScript esto no es así y nuestro pequeño amigo nos devuelve en esa expresión un enorme ‘false’.

El desconcierto sobre este asunto viene provocado por la propia especificación de ES5 donde en el apartado 11.9.6 The Strict Equality Comparison Algorithm se nos indica lo siguiente:

The comparison x === y, where x and y are values, produces true or false. Such a comparison is performed as follows:

If Type(x) is Number, then

  1. If x is NaN, return false.
  2. If y is NaN, return false.

Claro, este mismo fallo en la especificación hace que en cuanto una de las partes de la comparación sea NaN el resultado sea ‘false’ aun cuando no es el resultado esperado por la mayoría de desarrolladores.

Pero es que además la especificación IEEE 754, que es la usada en JavaScript para especificar números de punto flotante, indica que los NaNs nunca son iguales.

Y si quiero saber si una variable no es un número ¿Cómo lo hago?

El caso es bastante problemático porque si quiero saber si una variable mía, por lo que sea, no guarda ya un número, no puedo hacerlo comparando con NaN. Veamos:

Captura

BOOM. De repente tengo un bug sin comerlo ni beberlo.

Bueno, JavaScript ya pensó en ello y si queremos hacer esta comparación y salir del paso, podemos hacer uso de: window.isNaN(0/0); 

Esa función no tiene problemas y si que nos devuelve el valor esperado (true).

Además, ES6 en su afán por arreglar todos aquellos fallos de diseño del lenguaje, ha creado otra forma de comparar objetos por medio del método ‘is’ del objeto Object. Ahora podemos hacer esto:

Captura2.PNG

Y como vemos el resultado es el esperado siempre. Nuestro pobre niño está creciendo y cada vez deja menos margen a los abusones del patio del recreo.

Nos leemos 🙂

Imagen | thewpcrowd

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s