parselong - round javascript
¿Qué es mejor, número(x) o parseFloat(x)? (5)
¿Cual es mejor?
Estoy pidiendo esto solo por el hecho de afeitar algunos bytes, ya que puedo usar + x en lugar de número (x). ¿Parsefloat hace algo mejor?
La diferencia entre parseFloat y Number
parseFloat
/ parseInt
es para analizar una cadena, mientras que Number
/ +
es para forzar un valor a un número. Se comportan de manera diferente. Pero primero miremos dónde se comportan de la misma manera:
parseFloat(''3''); // => 3
Number(''3''); // => 3
parseFloat(''1.501''); // => 1.501
Number(''1.501''); // => 1.501
parseFloat(''1e10''); // => 10000000000
Number(''1e10''); // => 10000000000
Por lo tanto, 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, mientras que Number
da NaN
(no un número):
parseFloat(''1x''); // => 1
Number(''1x''); // => NaN
Además, Number
entiende la entrada hexadecimal mientras que parseFloat
no:
parseFloat(''0x10''); // => 0
Number(''0x10''); // => 16
Pero Number
actú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 que el Number
es más razonable, así que casi siempre uso el Number
personalmente (y encontrará que muchas de las funciones internas de JavaScript también usan el 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 parseFloat
es útil porque los estilos vienen en una forma como ''3px''
, en cuyo caso quiero soltar la parte ''px''
y solo obtener el 3
, así que me resulta útil parseFloat
aquí. Pero realmente cuál elegir, depende de usted y qué formas de entrada desea aceptar.
Tenga en cuenta que usar el operador unario +
es exactamente lo mismo que usar el Number
como una función:
Number(''0x10''); // => 16
+''0x10''; // => 16
Number(''10x''); // => NaN
+''10x''; // => NaN
Number(''40''); // => 40
+''40''; // => 40
Entonces usualmente solo uso +
para abreviar. Mientras sepa lo que hace, me resulta fácil de leer.
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 Number constuctor crea una nueva instancia de número 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
La diferencia es qué sucede cuando la entrada no es un "número apropiado". Number
devuelve NaN
mientras que parseFloat
analiza "tanto como puede". Si se llama a la cadena vacía Number
devuelve 0
mientras que parseFloat devuelve NaN
.
Por ejemplo:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
Para cadena vacía, son diferentes.
+""
y Number("")
devuelve 0, mientras que parseFloat("")
devuelve NaN.
Por lo que yo sé, y esto solo es escuchado por colegas, por lo que podría estar completamente informado, ParseFloat es marginalmente más rápido.
Aunque en investigaciones posteriores, parecería que esta diferencia de rendimiento depende del navegador.
http://jsperf.com/parseint-vs-parsefloat/6
Eche un vistazo a estos resultados de jsPerf y haga su llamada. (Incluye + x pruebas también)
Como se señala en la respuesta de @xdazz, +""
y Number("")
devuelven 0
mientras que parseFloat("")
devuelve NaN
así que de nuevo iría con parseFloat, porque una cadena vacía NO significa el número 0, solo una cadena con el caracter "0"
en el medio 0;