parseInt vs unary plus, ¿cuándo usar cuál?
¿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 de 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 intento convertir cadenas que no son números, ambas devuelven NaN
:
var b = parseInt("test", 10); // b === NaN
var b = +"test"; // b === NaN
Entonces, ¿cuándo debería preferir usar parseInt
el plus unario (especialmente en node.js)?
editar : ¿y cuál es la diferencia con el operador de doble tilde ~~
?
La tabla de conversión definitiva de cualquier cosa a número:
Mostrar fragmento de código
Bueno, aquí hay algunas diferencias que conozco:
Una cadena vacía
""
se evalúa como a0
, mientras queparseInt
se evalúa comoNaN
. En mi opinión, una cadena en blanco debe ser un archivoNaN
.+'' === 0; //true isNaN(parseInt('',10)); //true
El unario
+
actúa más bienparseFloat
ya que también acepta decimales.parseInt
por otro lado, detiene el análisis cuando ve un carácter no numérico, como el punto que pretende ser un punto decimal.
.+'2.3' === 2.3; //true parseInt('2.3',10) === 2; //true
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 analizó como un número.Por otro lado , el unario
+
regresaráNaN
si la cadena completa no se puede convertir en un número.parseInt('2a',10) === 2; //true parseFloat('2a') === 2; //true isNaN(+'2a'); //true
Como se ve en el comentario de @Alex K. ,
parseInt
yparseFloat
se analizará por carácter. Esto significa que las notaciones hexadecimales y de exponentes fallarán ya quex
ye
se tratan como componentes no numéricos (al menos en base10).Sin embargo , el unario
+
los convertirá correctamente.parseInt('2e3',10) === 2; //true. This is supposed to be 2000 +'2e3' === 2000; //true. This one's correct. parseInt("0xf", 10) === 0; //true. This is supposed to be 15 +'0xf' === 15; //true. This one's correct.