¿Cuáles son las diferencias entre esta línea?
var a = parseInt("1", 10); // a === 1
y esta linea
var a = +"1"; // a === 1
Esta prueba jsperf muestra que el operador unario es mucho más rápido en la versión actual de Chrome, suponiendo que sea para node.js !?
Si trato de convertir cadenas que no son números, ambos regresan NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
Entonces, ¿cuándo debería preferir usar parseInt
sobre el plus unario (especialmente en node.js) ???
editar : ¿y cuál es la diferencia con el operador de doble tilde ~~
?
javascript
node.js
hereandnow78
fuente
fuente
Respuestas:
Consulte esta respuesta para ver un conjunto más completo de casos.
Bueno, aquí hay algunas diferencias que conozco:
Una cadena vacía se
""
evalúa como a0
, mientras que separseInt
evalúa comoNaN
. En mi opinión, una cadena en blanco debe ser aNaN
.El unario
+
actúa más comoparseFloat
ya que también acepta decimales.parseInt
por otro lado, deja de analizar cuando ve un carácter no numérico, como el punto que pretende ser un punto decimal.
.parseInt
yparseFloat
analiza y construye la cadena de izquierda a derecha . Si ven un carácter no válido, devuelve lo que se ha analizado (si lo hay) como un número, yNaN
si ninguno se ha analizado como un número.El unario,
+
por otro lado, volveráNaN
si la cadena completa no es convertible a un número.Como se ve en el comentario de @Alex K. ,
parseInt
yparseFloat
se analizará por carácter. Esto significa que las notaciones hexadecimales y exponentes fallarán ya quex
ye
se tratan como componentes no numéricos (al menos en base10).Sin
+
embargo, el unario los convertirá correctamente.fuente
+"0xf" != parseInt("0xf", 10)
Math.floor()
, que básicamente corta la parte decimal."2e3"
no es una representación entera válida para2000
. Sin embargo, es un número válido de coma flotante:parseFloat("2e3")
rendirá correctamente2000
como respuesta. Y"0xf"
requiere al menos una base 16, razón por la cualparseInt("0xf", 10)
devuelve0
, mientras queparseInt("0xf", 16)
devuelve el valor de 15 que esperaba.Math.floor(-3.5) == -4
y~~-3.5 == -3
.La mejor tabla de conversión de cualquier número a número:
Mostrar fragmento de código
fuente
"NaN"
a esta tabla.isNaN
columna a esta tabla: por ejemplo,isNaN("")
es falsa (es decir, se considera un número), peroparseFloat("")
esNaN
, lo que puede ser un problema, si está intentando usarisNaN
para validar la entrada antes de pasarla aparseFloat
'{valueOf: function(){return 42}, toString: function(){return "56"}}'
a la lista. Los resultados mixtos son interesantes.+
es solo una forma más corta de escribirNumber
, y las más avanzadas son formas locas de hacerlo que fallan en los casos extremos.La tabla en la respuesta de thg435 creo que es completa, sin embargo, podemos resumir con los siguientes patrones:
true
a 1, pero"true"
aNaN
.parseInt
es más liberal para cadenas que no son dígitos puros.parseInt('123abc') === 123
, mientras que los+
informesNaN
.Number
aceptará números decimales válidos, mientras queparseInt
simplemente descarta todo más allá del decimal. Por lo tanto,parseInt
imita el comportamiento de C, pero quizás no sea ideal para evaluar la entrada del usuario.parseInt
, al ser un analizador mal diseñado , acepta entrada octal y hexadecimal. Unary plus solo toma hexademical.Los valores de falsa se convierten a
Number
seguir lo que tendría sentido en C:null
yfalse
ambos son cero.""
ir a 0 no sigue esta convención pero tiene bastante sentido para mí.Por lo tanto, creo que si está validando la entrada del usuario, unary plus tiene el comportamiento correcto para todo excepto para aceptar decimales (pero en mi vida real estoy más interesado en capturar la entrada de correo electrónico en lugar de userId, el valor se omite por completo, etc.), mientras que parseInt es demasiado liberal.
fuente
Tenga cuidado, parseInt es más rápido que + operador unario en Node.JS, es falso que + o | 0 son más rápidos, son más rápidos solo para elementos NaN.
Mira esto:
fuente
Considere el rendimiento también. Me sorprendió que
parseInt
supere a unary plus en iOS :) Esto es útil solo para aplicaciones web con un gran consumo de CPU. Como regla general, sugeriría que JS opt-guys considere cualquier operador JS sobre otro desde el punto de vista del rendimiento móvil hoy en día.Entonces, ve primero al móvil ;)
fuente