¿Cuál es la diferencia entre parseInt() y Number()?

Resuelto Mark asked hace 13 años • 11 respuestas

¿ Cómo funcionan parseInt()y Number()se comportan de manera diferente al convertir cadenas en números?

Mark avatar Nov 04 '10 01:11 Mark
Aceptado

Bueno, son semánticamente diferentes , el Numberconstructor llamado como función realiza conversión de tipos y parseIntrealiza análisis , por ejemplo:

// parsing:
parseInt("20px");       // 20
parseInt("10100", 2);   // 20
parseInt("2e1");        // 2

// type conversion
Number("20px");       // NaN
Number("2e1");        // 20, exponential notation

También parseIntignorará los caracteres finales que no se correspondan con ningún dígito de la base utilizada actualmente.

El Numberconstructor no detecta octales implícitos, pero puede detectar la notación octal explícita:

Number("010");         // 10
Number("0o10")         // 8, explicit octal

parseInt("010");       // 8, implicit octal
parseInt("010", 10);   // 10, decimal radix used

Y puede manejar números en notación hexadecimal, como parseInt:

Number("0xF");   // 15
parseInt("0xF"); //15

Además, una construcción ampliamente utilizada para realizar la conversión de tipos numéricos es el operador unario +(p. 72) , que equivale a utilizar el Numberconstructor como una función:

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10
Christian C. Salvadó avatar Nov 03 '2010 18:11 Christian C. Salvadó
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)

Los dos primeros le darán un mejor rendimiento ya que devuelven una primitiva en lugar de un objeto.

letronje avatar Nov 03 '2010 18:11 letronje

Una pequeña diferencia es lo que convierten de undefinedo null.

Number() Or Number(null) Or Number('') // returns 0

mientras

parseInt() Or parseInt(null) // returns NaN
Naeem Shaikh avatar Mar 15 '2018 06:03 Naeem Shaikh

Resumen:

parseInt():

  • Toma una cadena como primer argumento, la base (un número entero que es la base de un sistema numérico, por ejemplo, 10 decimal o 2 binario) como segundo argumento.
  • La función devuelve un número entero; si el primer carácter no se puede convertir en un número, NaNse devolverá.
  • Si la parseInt()función encuentra un valor no numérico, cortará el resto de la cadena de entrada y solo analizará la parte hasta el valor no numérico.
  • Si la base es undefinedo 0, JS asumirá lo siguiente:
    • Si la cadena de entrada comienza con "0x" o "0X", la base es 16 (hexadecimal), el resto de la cadena se analiza en un número.
    • Si el valor de entrada comienza con 0, la base puede ser 8 (octal) o 10 (decimal). La base que se elija depende de la implementación del motor JS. ES5especifica que se debe utilizar 10 entonces. Sin embargo, esto no es compatible con todos los navegadores, por lo tanto, siempre especifique la base si sus números pueden comenzar con 0.
    • Si el valor de entrada comienza con cualquier número, la base será 10

Number():

  • El Number()constructor puede convertir cualquier argumento de entrada en un número. Si el Number()constructor no puede convertir la entrada en un número, NaNse devolverá.
  • El Number()constructor también puede manejar números hexadecimales, deben comenzar con 0x.

Ejemplo:

console.log(parseInt('0xF', 16));  // 15

// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));

// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10));  // 10

// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));


console.log('\n');


// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));

// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));

// scientific notation is allowed
console.log(Number('152e-1'));  // 15.21
Expandir fragmento

Willem van der Veen avatar Nov 05 '2018 17:11 Willem van der Veen