Al ver esta pregunta: ¿Hay una forma (incorporada) en JavaScript para verificar si una cadena es un número válido? y esto: jsperf , uno de los enfoques presentados es este (mutatis mutandis):
var a = "123" var b = "123b" if ( +a === +a ) // true if ( +b === +b ) // false¿Cómo funciona esta lógica internamente en JavaScript para que esto sea posible?
Mi pregunta no es cómo verificar si una cadena es un número válido; esto ya está respondido aquí: Validar números decimales en JavaScript - IsNumeric() . Quiero entender cómo funciona la declaración +a === +a .
+ convierte el valor en un número.
a se convierte en 123 y 123 === 123 .
b se convierte en NaN pero NaN !== NaN (porque NaN nunca es igual a otro NaN según el paso 4a de las reglas de igualdad ).
El operador + aquí se conoce como Unary Plus .
El operador unario más precede a su operando y se evalúa como su operando, pero intenta convertirlo en un número, si aún no lo ha hecho.
+"123" se evalúa como 123 .
+a === +a -> +"123" === +"123" -> 123 === 123 -> true +"123b" evalúa como NaN (no es un número) , ya que el carácter b no se puede convertir con Unary Plus sin ningún prefijo (como 0x para hexadecimal), Unary Plus asumirá que el valor es decimal (0-9). NaN es un caso especial en el sentido de que no se compara con nada, ni siquiera consigo mismo:
NaN === NaN -> false NaN !== NaN -> true Debido a esto, nuestro caso de prueba +b falla:
+b === +b -> +"123b" === +"123b" -> NaN === NaN -> false Si desea que ambos se evalúen como verdaderos, podemos agregar una llamada isNaN() al final:
if ( +a === +a || isNaN(+a) ) if ( +b === +b || isNaN(+b) )+"123b" es NaN . NaN no es igual a nada, incluido NaN.