¿Cual es mejor?
Estoy preguntando esto solo por afeitar unos pocos bytes, ya que puedo usar + x en lugar de número (x). ¿Parsefloat hace algo mejor?
javascript
optimization
Namanyay Goel
fuente
fuente
Respuestas:
La diferencia entre parseFloat y Number
parseFloat
/parseInt
es para analizar una cadena, mientras queNumber
/+
es para forzar un valor a un número. Se comportan de manera diferente. Pero primero veamos dónde se comportan igual:Entonces, siempre que tenga una entrada numérica estándar, no hay diferencia. Sin embargo, si su entrada comienza con un número y luego contiene otros caracteres,
parseFloat
trunca el número de la cadena, mientrasNumber
daNaN
(no un número):Además,
Number
comprende la entrada hexadecimal mientrasparseFloat
que no:Pero
Number
actúa de forma extraña con cadenas vacías o cadenas que contienen solo espacios en blanco:En general, considero
Number
que es más razonable, por lo que casi siempre lo usoNumber
personalmente (y verás que muchas de las funciones internas de JavaScript también se usanNumber
). Si alguien escribe'1x'
, prefiero mostrar un error en lugar de tratarlo como si hubiera escrito'1'
. La única vez que realmente hago una excepción es cuando estoy convirtiendo un estilo en un número, en cuyo casoparseFloat
es útil porque los estilos vienen en una forma como'3px'
, en cuyo caso quiero soltar la'px'
parte y simplemente obtener el3
, así que me pareceparseFloat
útil aquí. Pero realmente cuál elija usted depende de usted y qué formas de entrada desea aceptar.Tenga en cuenta que usar el
+
operador unario es exactamente lo mismo que usarNumber
como función:Por lo general, solo uso
+
para abreviar. Mientras sepa lo que hace, me resulta fácil de leer.fuente
Number()
como "extraño" Incluso lo consideraría como más esperado, el espacio en blanco es un valor vacío pero no es nulo / indefinido => 0 es un buen resultado. Grande (+) para ti para los escaparates de todos modos :)Number('Infinity') === Infinity
mientras queparseInt('Infinity') === NaN
+
(unario más) para esto, porque si olvida un punto y coma en la línea anterior, se podría evaluar una expresión de suma.La diferencia es lo que sucede cuando la entrada no es un "número apropiado".
Number
vuelveNaN
mientrasparseFloat
analiza "tanto como puede". Si se llama, la cadena vacíaNumber
vuelve0
mientras que parseFloat regresaNaN
.Por ejemplo:
fuente
NaN != NaN
sin embargoNaN != NaN
evalúa como VERDADERO - ¡gracias por el consejo!isNaN(NaN)
devuelvetrue
En estos ejemplos puedes ver la diferencia:
parseFloat es un poco más lento porque busca la primera aparición de un número en una cadena, mientras que el constructor de números crea una nueva instancia de número a partir de cadenas que contiene valores numéricos con espacios en blanco o que contiene valores falsos.
PD Si está interesado en algunas soluciones de conversión de tipo universal, puede leer la publicación sobre conversión de tipo en mi blog: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
fuente
Para la cadena vacía, son diferentes.
+""
yNumber("")
devuelve 0, mientras queparseFloat("")
devuelve NaN.fuente
parseFloat()
tiene el resultado correcto ya que una cadena vacía NO es el número0
(léase: NaN) mientras que una cadena con el carácter"0"
ES0
;+x
devuelve0
no solo para una cadena vacía sino también para cualquier cadena de espacio en blanco. Ejemplos:+" "
,+"\t\t\t"
,+"\n\n"
- todos ellos dan0
como resultadoHasta donde yo sé, y esto solo lo escuchan los colegas, por lo que podría estar completamente mal informado, que parseFloat es marginalmente más rápido.
Aunque en futuras investigaciones, parece que esta diferencia de rendimiento depende del navegador.
http://jsperf.com/parseint-vs-parsefloat/6
Echa un vistazo a estos resultados de jsPerf y haz que te llamen. (incluye + x pruebas también)
Como se señaló en la respuesta de @xdazz,
+""
yNumber("")
regresar0
mientrasparseFloat("")
regresa, deNaN
nuevo, iría con parseFloat, porque una cadena vacía NO significa el número 0, solo una cadena con el carácter"0"
significa 0;fuente
parseFloat()
sigue siendo el ganador.