javascript - decimals - ¿Cuál es la diferencia entre Number(…) y parseFloat(…)
string to number javascript (5)
Cuando no se usa new
para crear un objeto de envoltorio para un valor numérico, el Number
se relega simplemente a hacer la conversión de tipo de cadena a número.
Por otra parte, ''parseFloat'', como mencionaste, puede analizar un número de punto flotante de cualquier cadena que comienza con un dígito, un decimal o +/-
Por lo tanto, si solo está trabajando con cadenas que contienen solo valores numéricos, Number(x)
y parseFloat(x)
resultarán en los mismos valores
¿Cuál es la diferencia entre parseInt (cadena) y Número (cadena) en JavaScript que se ha preguntado anteriormente?
Pero las respuestas se centraron básicamente en el radix
y la capacidad de parseInt
para tomar una cadena como "123htg"
y convertirla en 123
.
Lo que estoy preguntando aquí es si hay una gran diferencia entre los retornos de Number(...)
y parseFloat(...)
cuando le pasas una cadena de número real sin ningún tipo de raíz.
El funcionamiento interno no es tan diferente, como ya respondió @James Allardic. Aunque hay una diferencia. Al usar parseFloat
, una cadena (recortada) que comienza con uno o más caracteres numéricos seguidos por caracteres alfanuméricos se puede convertir en un Número, con un Number
que no tendrá éxito. Como en:
parseFloat(''3.23abc''); //=> 3.23
Number(''3.23abc''); //=> NaN
En ambas conversiones, la cadena de entrada se recorta, por cierto:
parseFloat('' 3.23abc ''); //=> 3.23
Number('' 3.23 ''); //=> 3.23
No hay mucha diferencia, siempre y cuando estés seguro de que no hay más que dígitos en tu cadena. Si los hay, Number
devolverá NaN
.
Otro problema que podría obtener al usar el constructor de Number
es que los compañeros de trabajo podrían pensar que olvidó la new
palabra clave y agregarla más adelante, lo que provocará que las comparaciones estrictas no new Number(123) === 123
-> falso mientras que Number(123) === 123
-> verdadero.
En general, prefiero dejar el constructor de Number
por lo que es, y solo usar la sintaxis más corta que existe para convertir a int / float: +numString
, o usar parse*
.
No. Ambos resultarán en que se ToNumber(string)
la ToNumber(string)
interna ToNumber(string)
.
De la sección 15.7.1 de ES5 (el constructor de números llamado como una función):
Cuando se llama a
Number
como una función en lugar de como un constructor, realiza una conversión de tipos ...Devuelve un valor de Número (no un objeto de Número) calculado por
ToNumber(value)
si se proporcionó el valor, de lo contrario, devuelve+0
.
De la sección 15.1.2.3 de ES5 (parseFloat (cadena)):
... Si ni
trimmedString
ni ningún prefijo detrimmedString
satisfacen la sintaxis de unStrDecimalLiteral
(ver 9.3.1) ...
Y ToNumber(string) es la sección titulada "ToNumber Applied to the String Type", a lo que se refiere la primera cita cuando dice ToNumber(value)
.
Actualización (ver comentarios)
Al llamar al constructor de Number
con el new
operador, obtendrá una instancia del objeto Number
, en lugar de un literal numérico. Por ejemplo:
typeof new Number(10); //object
typeof Number(10); //number
Esto se define en la sección 15.7.2 (El constructor de números):
Cuando se llama a
Number
como parte de unanew
expresión, es un constructor: inicializa el objeto recién creado.
Por favor, disculpe la publicación de otra respuesta, pero acabo de llegar a través de una búsqueda en Google y no encontré todos los detalles que quería. Ejecutando el siguiente código en Node.js:
var vals = ["1", "1.1", "0", "1.1abc", "", " ", null];
for(var i = 0; i < vals.length; i++){
var ifTest = false;
if(vals[i])
{
ifTest = true;
}
console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest);
}
da la siguiente salida:
val=1, Number()=1, parseFloat()=1, if()=true
val=1.1, Number()=1.1, parseFloat()=1.1, if()=true
val=0, Number()=0, parseFloat()=0, if()=true
val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true
val=, Number()=0, parseFloat()=NaN, if()=false
val= , Number()=0, parseFloat()=NaN, if()=true
val=null, Number()=0, parseFloat()=NaN, if()=false
Algunos puntos destacados:
- Si se protege con un if (val) antes de intentar convertir a un número, parseFloat () devolverá un número, excepto en el caso de espacios en blanco.
- Número devuelve un número en todos los casos, excepto los caracteres no numéricos, aparte del espacio en blanco.
Por favor, siéntase libre de agregar cualquier caso de prueba que pueda faltar.