¿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/parseIntes 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,
parseFloattrunca el número de la cadena, mientrasNumberdaNaN(no un número):Además,
Numbercomprende la entrada hexadecimal mientrasparseFloatque no:Pero
Numberactúa de forma extraña con cadenas vacías o cadenas que contienen solo espacios en blanco:En general, considero
Numberque es más razonable, por lo que casi siempre lo usoNumberpersonalmente (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 casoparseFloates ú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 usarNumbercomo 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') === Infinitymientras 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".
NumbervuelveNaNmientrasparseFloatanaliza "tanto como puede". Si se llama, la cadena vacíaNumbervuelve0mientras que parseFloat regresaNaN.Por ejemplo:
fuente
NaN != NaNsin embargoNaN != NaNevalúa como VERDADERO - ¡gracias por el consejo!isNaN(NaN)devuelvetrueEn 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;+xdevuelve0no solo para una cadena vacía sino también para cualquier cadena de espacio en blanco. Ejemplos:+" ",+"\t\t\t",+"\n\n"- todos ellos dan0como 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("")regresar0mientrasparseFloat("")regresa, deNaNnuevo, 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.