parseInt vs unary plus, ¿cuándo usar cuál?

Resuelto hereandnow78 asked hace 11 años • 6 respuestas

¿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 parseIntel plus unario (especialmente en node.js)?

editar : ¿y cuál es la diferencia con el operador de doble tilde ~~?

hereandnow78 avatar Jun 14 '13 17:06 hereandnow78
Aceptado

La tabla de conversión definitiva de cualquier cosa a número: Tabla de conversión

Mostrar fragmento de código

georg avatar Jun 14 '2013 10:06 georg

Bueno, aquí hay algunas diferencias que conozco:

  • Una cadena vacía ""se evalúa como a 0, mientras que parseIntse evalúa como NaN. En mi opinión, una cadena en blanco debe ser un archivo NaN.

      +'' === 0;              //true
      isNaN(parseInt('',10)); //true
    
  • El unario +actúa más bien parseFloatya que también acepta decimales.

    parseIntpor 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
    
  • parseInty parseFloatanaliza 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, y NaNsi ninguno se analizó como un número.

    Por otro lado , el unario +regresará NaNsi 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. , parseInty parseFloatse analizará por carácter. Esto significa que las notaciones hexadecimales y de exponentes fallarán ya que xy ese 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.
    
Joseph avatar Jun 14 '2013 10:06 Joseph