¿Cómo hacer parseInt()
y Number()
comportarse de manera diferente al convertir cadenas en números?
fuente
¿Cómo hacer parseInt()
y Number()
comportarse de manera diferente al convertir cadenas en números?
Bueno, son semánticamente diferentes , el Number
constructor llamado como función realiza la conversión de tipos y parseInt
realiza 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 parseInt
detecta 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 parseInt
ignorará los caracteres finales que no se corresponden con ningún dígito de la base utilizada actualmente.
El Number
constructor 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 Number
constructor como una función:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
trata con los octales de forma muy parecida a hexadecimal y binario:Number('0o10') == 8
los dos primeros le darán un mejor rendimiento ya que devuelve un primitivo en lugar de un objeto
fuente
new Number()
es diferente aNumber()
.typeof Number("123") => number
new Number("1") != new Number("1")
. NUNCA UTILICEnew Number
. Nunca nunca nunca nuncaNumber("1")
, por otro lado, es perfectamente razonable.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ógicamentedoSomething
debería llamarse. Pero no lo hará. Además, si analizara solo un númerolet x = new Number("2");
,x === 2
sería falso. Esa es una razón clara por la que no debe usarnew Number
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 deNumber
yparseInt
. Incluso tienen "característica" que devuelve 0 para el argumento no numérico. Aquí hay pruebas de rendimiento .fuente
Number
yparseInt
aún más lento 99% que el resto. Además para mí son menos atractivos visualmente también :-)parseInt
oNumber
son más preferibles. Si está programando un emulador N64 con millones de conversiones por segundo, podría considerar esos trucos.(2**31).toString() >> 0
lo 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 que2**32 - 1
también se desbordará.He encontrado dos enlaces de rendimiento comparan entre varias formas de convertir
string
aint
.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
fuente
Una diferencia menor es de qué se convierten
undefined
onull
,mientras
fuente
Resumen:
parseInt()
:NaN
, se devolverá.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.undefined
o 0, JS asumirá lo siguiente:ES5
especifica 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.Number()
:Number()
constructor puede convertir cualquier entrada de argumento en un número. Si elNumber()
constructor no puede convertir la entrada en un número,NaN
se devolverá.Number()
constructor también puede manejar el número hexadecimal, tienen que comenzar con0x
.Ejemplo:
fuente
Siempre uso parseInt, pero tenga cuidado con los ceros a la izquierda que lo forzarán en modo octal .
fuente
parseInt(value, radix)
esa manera usted no tiene accidental octal modo de conversiones, etc.0
, incluso en modo no estricto. Pero esto se ha solucionado y ahora los ceros a la izquierda simplemente se ignoran, porparseInt("070")
lo que llegaría a ser70
.parseInt()
.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.
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 nativafuente
parseInt se convierte en un número entero, es decir, elimina los decimales. El número no se convierte en entero.
fuente
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?
Es completamente carnicero números realmente grandes o muy pequeños. Por extraño que parezca, funciona normalmente si estas entradas son una cadena.
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.
fuente