¿Cómo se comportan de manera diferente parseInt()
y Number()
al convertir cadenas a números?¿Cuál es la diferencia entre parseInt() y Number()?
Respuesta
Bueno, ellos son semánticamente diferente, los Number
constructor called as a function realiza tipo de conversión y parseInt
realiza análisis sintáctico, 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 en la cuerda, Analizará el número en la base octal, esto ha cambiado en ECMAScript 5, la nueva versión del estándar, pero tomará mucho tiempo entrar en las implementaciones del navegador (es una incompatibilidad con ECMAScript 3), también parseInt
wil Ignore los caracteres finales que no se corresponden con ningún dígito de la base utilizada actualmente.
El constructor Number
no detecta 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, al igual que parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Además, una construcción ampliamente utilizado para llevar a cabo numérico tipo de conversión, es el Unary +
Operator (p. 72), es equivalente a usar el constructor Number
como una función:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Siempre uso parseInt, pero tenga cuidado con los ceros a la izquierda que lo forzarán a modo octal.
Creo que siempre es una buena idea proporcionar una base para 'parseInt (value, radix)' de esa manera no tiene conversiones accidentales * modo octal *, etc. – awesomo
Ceros a la izquierda * lo forzará a modo octal en ECMAScript 3. ECMAScript 5 lo analizará en '0', incluso en modo no estricto. Pero esto se ha solucionado y ahora los ceros a la izquierda se ignoran, por lo que 'parseInt (" 070 ")' se convertiría en '70'. –
También debería usar un linter que le advierta que proporcione un valor de raíz en 'parseInt()'. – Justin
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
primero dos le dará mejor rendimiento ya que devuelve una primitiva en lugar de un objeto.
Ah, veo Number (someString) significa que paso una cadena a su constructor y obtengo un objeto a cambio. – Mark
'new Number()' es diferente a 'Number()'. 'Número typeof ("123") => number' – Gareth
creo que este es uno de los puntos más importantes a tomar nota desde el punto de vista del rendimiento, como objetos consumen mucha más memoria y tiempo de procesamiento. Buena discusión de ustedes dos, letronje y Gareth. – Dave
Si está buscando el rendimiento, entonces probablemente los mejores resultados lo obtendrá con el desplazamiento a la derecha en el bit "10">>0
. También multiplique ("10" * 1
) o no (~~"10"
). Todos ellos son mucho más rápidos de Number
y parseInt
. Incluso tienen "característica" que devuelve 0 para el argumento sin número. Aquí están Performance tests.
La velocidad de los diversos los enfoques parecen cambiar con las revisiones del navegador a lo largo del tiempo. La prueba ligado también ha cambiado, y la última versión de este comentario es aquí - http://jsperf.com/number-vs-parseint-vs-plus/39 - afortunadamente, el sitio contiene versiones anteriores de la prueba, así – bobo
@bobo, seguro. Por curiosidad, verificó con chrome - 'Number' y' parseInt' aún más lento el 99% que el resto. Además, para mí también son menos atractivos visualmente :-) – Saulius
@Saulius menos atractivo visualmente, pero mucho más compatible con Google :) – jackweirdy
Encontré dos enlaces de rendimiento que se pueden comparar entre varias formas de convertir string
en int
.
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
parseInt convierte a un número entero, es decir, que las tiras decimales. El número no se convierte a entero.
- 1. ¿Cuál es la diferencia entre Number (...) y parseFloat (...)
- 2. diferencia entre parseInt() y parseFloat()
- 3. Diferencia entre parseInt y valueOf en java?
- 4. Diferencia de comportamiento entre parseInt() y parseFloat()
- 5. SQL: Diferencia entre "BETWEEN" vs "current_date - number"
- 6. ¿Cuál es la diferencia entre {0} y ""?
- 7. Cuál es la diferencia entre = y: =
- 8. ¿Cuál es la diferencia entre .ToString (+) y ""
- 9. Cuál es la diferencia entre $ (...) y `...`
- 10. ¿cuál es la diferencia entre:.! y: r !?
- 11. ¿Cuál es la diferencia entre ".equals" y "=="?
- 12. ¿Cuál es la diferencia entre dict() y {}?
- 13. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 14. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 15. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 16. ¿Cuál es la diferencia entre + = y = +?
- 17. ¿Cuál es la diferencia entre " " y ""?
- 18. Cuál es la diferencia entre $ y jQuery
- 19. ¿Cuál es la diferencia entre 987 y (987) en JavaScript?
- 20. Diferencia de rendimiento entre VARCHAR2 a NUMBER
- 21. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 22. Cuál es la diferencia entre la función() {}() y la función() {}()
- 23. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 24. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 25. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 26. ¿Cuál es la diferencia entre la sección .got y .got.plt?
- 27. ¿Cuál es la diferencia entre el colado y la coerción?
- 28. ¿cuál es la diferencia entre el complemento y la biblioteca?
- 29. ¿Cuál es la diferencia entre el casting y la conversión?
- 30. ¿Cuál es la diferencia entre WPF y la aplicación Silverlight?
Interesante, ¿no ignora parseInt los caracteres que siguen al número? Porque en mi caso preferiría obtener un NaN en lugar de los 20 al convertir. – Mark
Sí lo hace. Parece que definitivamente quieres Number() – Gareth
Bien, entonces creo que iré con Number() pero muchas gracias por aclarar este punto y todos estos ejemplos! :-) – Mark