¿Cuál es mejor, número (x) o parseFloat (x)?

147

¿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?

Namanyay Goel
fuente
2
Los números de punto flotante de precisión simple ocupan 4 bytes en un sistema de 32 bits, así como enteros simples. No sé cómo JavaScript maneja los flotadores, pero supongo que es más o menos lo mismo.
Christian
55
@Christian: Todos los números en Javascript son flotantes de doble precisión.
Guffa
1
Hubiera votado a favor de esta pregunta si no fuera por el segmento EDITAR
LaPuyaLoca

Respuestas:

309

La diferencia entre parseFloat y Number

parseFloat/ parseIntes para analizar una cadena, mientras que Number/ +es para forzar un valor a un número. Se comportan de manera diferente. Pero primero veamos dónde se comportan igual:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

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, mientras Numberda NaN(no un número):

parseFloat('1x'); // => 1
Number('1x'); // => NaN

Además, Numbercomprende la entrada hexadecimal mientras parseFloatque no:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

Pero Numberactúa de forma extraña con cadenas vacías o cadenas que contienen solo espacios en blanco:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

En general, considero Numberque es más razonable, por lo que casi siempre lo uso Numberpersonalmente (y verás que muchas de las funciones internas de JavaScript también se usan Number). 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 caso parseFloates útil porque los estilos vienen en una forma como '3px', en cuyo caso quiero soltar la 'px'parte y simplemente obtener el 3, así que me parece parseFloatú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 usar Numbercomo función:

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

Por lo general, solo uso +para abreviar. Mientras sepa lo que hace, me resulta fácil de leer.

Nathan Wall
fuente
2
No consideraría el comportamiento del espacio en blanco => 0Number() 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 :)
jave.web
44
@NathanWall: Tal vez quiera mencionar eso Number('Infinity') === Infinitymientras queparseInt('Infinity') === NaN
sstur
3
No usaría +(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.
Jackson
1
Para los casos en que se comportan igual, descubrí que parseFloat es de 1% a 15% más lento, y se vuelve más lento cuando aumenta el número de dígitos decimales en una cadena. Con 1M ejecutado en mi sistema, parseFloat ('1.501') es 5% más lento que Number ('1.501'), y parseFloat ('1.50137585467') es 15% más lento que Number ('1.50137585467'). Entonces, voy por el Número ().
bytepan
1
@ ChrisBrownie55 Wow, buena captura. No sabía que parseFloat puede hacer eso. ¡Supongo que Infinity no es un número entero!
sstur
9

La diferencia es lo que sucede cuando la entrada no es un "número apropiado". Numbervuelve NaNmientras parseFloatanaliza "tanto como puede". Si se llama, la cadena vacía Numbervuelve 0mientras que parseFloat regresa NaN.

Por ejemplo:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32
Jon
fuente
44
Tenga en cuenta que NaN != NaNsin embargo
Wex
@Wex Oh, usted dice que se NaN != NaNevalúa como VERDADERO - ¡gracias por el consejo!
jave.web
44
use isNaN () para probar el valor NaN, isNaN(NaN)devuelvetrue
jave.web
5

En estos ejemplos puedes ver la diferencia:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

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

micnic
fuente
2

Para la cadena vacía, son diferentes.

+""y Number("")devuelve 0, mientras que parseFloat("")devuelve NaN.

xdazz
fuente
2
Me atrevería a decir que parseFloat()tiene el resultado correcto ya que una cadena vacía NO es el número 0(léase: NaN) mientras que una cadena con el carácter "0"ES 0;
Christopher
+xdevuelve 0no solo para una cadena vacía sino también para cualquier cadena de espacio en blanco. Ejemplos: +" ", +"\t\t\t", +"\n\n"- todos ellos dan 0como resultado
Lukasz Wiktor
2

Hasta 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, +""y Number("")regresar 0mientras parseFloat("")regresa, de NaNnuevo, 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;

Christopher
fuente
Aquí hay una prueba de pesca más exhaustiva para una forma más rápida de convertir ... parseFloat()sigue siendo el ganador.
mindplay.dk