¿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 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
Number()trata con los octales de forma muy parecida a hexadecimal y binario:Number('0o10') == 8los 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") => numbernew 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ógicamentedoSomethingdebería llamarse. Pero no lo hará. Además, si analizara solo un númerolet x = new Number("2");,x === 2sería falso. Esa es una razón clara por la que no debe usarnew NumberSi 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 deNumberyparseInt. Incluso tienen "característica" que devuelve 0 para el argumento no numérico. Aquí hay pruebas de rendimiento .fuente
NumberyparseIntaún más lento 99% que el resto. Además para mí son menos atractivos visualmente también :-)parseIntoNumberson más preferibles. Si está programando un emulador N64 con millones de conversiones por segundo, podría considerar esos trucos.(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 que2**32 - 1también se desbordará.He encontrado dos enlaces de rendimiento comparan entre varias formas de convertir
stringaint.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
fuente
Una diferencia menor es de qué se convierten
undefinedonull,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.undefinedo 0, JS asumirá lo siguiente: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.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,NaNse 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