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


Respuestas:


457

Bueno, son semánticamente diferentes , el Numberconstructor llamado como función realiza la conversión de tipos y parseIntrealiza el 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

Tenga en cuenta que si parseIntdetecta un cero a la izquierda en la cadena, analizará el número en base octal, esto ha cambiado en ECMAScript 5, la nueva versión del estándar, pero tomará mucho tiempo ingresar a las implementaciones del navegador (es una incompatibilidad con ECMAScript 3), también parseIntignorará los caracteres finales que no se corresponden con ningún dígito de la base utilizada actualmente.

El Numberconstructor no detecta los octales:

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

Pero 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 tipo numérico, es el Operador Unario +(p. 72) , es equivalente a usar el Numberconstructor como una función:

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10

Interesante, ¿parseInt ignora los caracteres que siguen al número? Porque en mi caso preferiría obtener un NaN en lugar de los 20 al convertir.
Mark

Si lo hace Parece que definitivamente quieres Number ()
Gareth

Bien, supongo que iré con Number (), pero muchas gracias por aclarar este punto y todos estos ejemplos. :-)
Marca el

1
Gracias por esto. Esta es la primera vez que veo NaN. Puede ser útil para algunas personas saber que NaN se prueba con la función isNaN (valor). Simplemente usando "if (value == NaN)", por ejemplo, no funcionará.
WonderfulDay

1
Number()trata con los octales de forma muy parecida a hexadecimal y binario:Number('0o10') == 8
Juan Mendes

22
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 devuelve un primitivo en lugar de un objeto


20
new Number()es diferente a Number(). typeof Number("123") => number
Gareth, el

8
También new Number("1") != new Number("1"). NUNCA UTILICEnew Number . Nunca nunca nunca nunca Number("1"), por otro lado, es perfectamente razonable.
Kragen Javier Sitaker

18
@Kragen, que sería mucho más beneficioso para la comunidad si explicado por qué no se debe utilizar "nuevo número" - en lugar de simplemente escribir "nunca" 5 veces ...
ken

1
@ken Comentario muy antiguo, pero para futuros visitantes, me imagino que es porque exactamente la razón que mencionaron para empezar. Analizo dos números let x = new Number("2"); let y = new Number("2");y luego hago una verificación de igualdad por cualquier razón, if (x == y) { doSomething(); }lógicamente doSomethingdebería llamarse. Pero no lo hará. Además, si analizara solo un número let x = new Number("2");, x === 2sería falso. Esa es una razón clara por la que no debe usarnew Number
Tom C

1
@TomC Estás viendo el resultado de un comentario editado (eso es lo que indica el ícono de lápiz que sigue al comentario); anteriormente no había explicación, solo una fuerte advertencia.
Ken

15

Si está buscando rendimiento, entonces probablemente obtendrá los mejores resultados con el desplazamiento a la derecha a nivel de bits "10">>0. También multiplique ( "10" * 1) o no ( ~~"10"). Todos ellos son mucho más rápidos de Numbery parseInt. Incluso tienen "característica" que devuelve 0 para el argumento no numérico. Aquí hay pruebas de rendimiento .


1
La velocidad de los diversos enfoques parece cambiar con las revisiones del navegador a lo largo del tiempo. La prueba vinculada también ha cambiado, y la última versión de este comentario está aquí: jsperf.com/number-vs-parseint-vs-plus/39 - afortunadamente el sitio contiene versiones anteriores de la prueba también
bobo

@bobo, claro. Por curiosidad comprobado con cromo, Numbery parseIntaún más lento 99% que el resto. Además para mí son menos atractivos visualmente también :-)
Saulius

15
Siempre prefiera la claridad del código sobre las optimizaciones "inútiles". Para la mayoría de los casos de uso parseInto Numberson más preferibles. Si está programando un emulador N64 con millones de conversiones por segundo, podría considerar esos trucos.
ngryman

1
La pregunta es sobre el comportamiento, la discusión sobre el rendimiento está fuera de tema.
neumática

1
Tenga en cuenta que esto no se puede usar para enteros grandes, específicamente enteros que no caben en un entero de 32 bits con signo, porque en JavaScript, los operadores bit a bit tratan sus operandos como una secuencia de 32 bits, en lugar de un decimal. hexadecimales u números octales. Por (2**31).toString() >> 0lo tanto, se desbordará a -2147483648. Puede usar JavaScript en >>>lugar de >>que JavaScript trate el operando como un entero de 32 bits sin signo, pero luego cualquier número mayor que 2**32 - 1también se desbordará.
hasc


6

Una diferencia menor es de qué se convierten undefinedo null,

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

mientras

parseInt() Or parseInt(null) // returns NaN

6

Resumen:

parseInt():

  • Toma una cadena como primer argumento, la raíz (un número entero que es la base de un sistema numérico, por ejemplo, decimal 10 o binario 2) como segundo argumento
  • La función devuelve un número entero, si el primer carácter no se puede convertir a un número NaN, se 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 raíz es undefinedo 0, JS asumirá lo siguiente:
    • Si la cadena de entrada comienza con "0x" o "0X", la raíz es 16 (hexadecimal), el resto de la cadena se analiza en un número.
    • Si el valor de entrada comienza con un 0, la raíz puede ser 8 (octal) o 10 (decimal). La raíz elegida depende de la implementación del motor JS. ES5especifica que 10 debe usarse entonces. Sin embargo, esto no es compatible con todos los navegadores, por lo tanto , siempre especifique radix si sus números pueden comenzar con un 0.
    • Si el valor de entrada comienza con cualquier número, la raíz será 10

Number():

  • El Number()constructor puede convertir cualquier entrada de argumento 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 el número hexadecimal, tienen que 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


5

Siempre uso parseInt, pero tenga cuidado con los ceros a la izquierda que lo forzarán en modo octal .


35
Creo que es siempre una buena idea para suministrar una raíz de parseInt(value, radix)esa manera usted no tiene accidental octal modo de conversiones, etc.
awesomo

Los ceros a la izquierda lo forzarán a modo octal en ECMAScript 3. ECMAScript 5 lo analizará 0, incluso en modo no estricto. Pero esto se ha solucionado y ahora los ceros a la izquierda simplemente se ignoran, por parseInt("070")lo que llegaría a ser 70.
Piotrek Hryciuk

2
También debe usar un linter que le advierta que proporcione un valor de raíz parseInt().
Justin

2

parseInt() -> Analiza un número para redix especificado.

Number()-> Convierte el valor especificado a su equivalente numérico o NaN si no lo hace.

Por lo tanto, para convertir algún valor no numérico en número, siempre debemos usar la función Number ().

p.ej.

Number("")//0
parseInt("")//NaN

Number("123")//123
parseInt("123")//123

Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string

Number(true)//1
parseInt(true) //NaN

Hay varias mayúsculas y minúsculas para las parseInt()funciones, ya que hace la conversión de redix, por lo tanto, debemos evitar usar la función parseInt () para fines de coerción.

Ahora, para verificar el clima, el valor proporcionado es Numérico o no, debemos usar la isNaN()función nativa


1

parseInt se convierte en un número entero, es decir, elimina los decimales. El número no se convierte en entero.


1

Es una buena idea mantenerse alejado de parseInt y usar Number y Math.round a menos que necesite hexadecimal u octal. Ambos pueden usar cadenas. ¿Por qué mantenerse alejado de eso?

parseInt(0.001, 10)
0

parseInt(-0.0000000001, 10)
-1

parseInt(0.0000000001, 10)
1

parseInt(4000000000000000000000, 10)
4

Es completamente carnicero números realmente grandes o muy pequeños. Por extraño que parezca, funciona normalmente si estas entradas son una cadena.

parseInt("-0.0000000001", 10)
0

parseInt("0.0000000001", 10)
0

parseInt("4000000000000000000000", 10)
4e+21

En lugar de arriesgarme a encontrar errores con este y los otros problemas que mencionaron las personas, simplemente evitaría parseInt a menos que necesite analizar algo que no sea base 10. Number, Math.round, Math.foor y .toFixed (0) pueden todos haga lo mismo para usar parseInt sin tener este tipo de errores.

Si realmente quiere o necesita usar parseInt para algunas de sus otras cualidades, nunca lo use para convertir flotadores en ints.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.