¿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 parseIntsobre 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 separseIntevalúa comoNaN. En mi opinión, una cadena en blanco debe ser aNaN.El unario
+actúa más comoparseFloatya que también acepta decimales.parseIntpor otro lado, deja de analizar cuando ve un carácter no numérico, como el punto que pretende ser un punto decimal..parseIntyparseFloatanaliza 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, yNaNsi ninguno se ha analizado como un número.El unario,
+por otro lado, volveráNaNsi la cadena completa no es convertible a un número.Como se ve en el comentario de @Alex K. ,
parseIntyparseFloatse analizará por carácter. Esto significa que las notaciones hexadecimales y exponentes fallarán ya quexyese 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á correctamente2000como 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) == -4y~~-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.isNaNcolumna 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 usarisNaNpara 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:
truea 1, pero"true"aNaN.parseIntes más liberal para cadenas que no son dígitos puros.parseInt('123abc') === 123, mientras que los+informesNaN.Numberaceptará números decimales válidos, mientras queparseIntsimplemente descarta todo más allá del decimal. Por lo tanto,parseIntimita 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
Numberseguir lo que tendría sentido en C:nullyfalseambos 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
parseIntsupere 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