2012-08-16 32 views
16

What is the difference between parseInt(string) and Number(string) in JavaScript se ha pedido previamente.¿Cuál es la diferencia entre Number (...) y parseFloat (...)

Pero las respuestas se centraron fundamentalmente en la radix y la capacidad de parseInt tomar una cadena como "123htg" y convertirlo en 123.

Lo que estoy preguntando aquí es si hay alguna diferencia entre los rendimientos de Number(...) y parseFloat(...) cuando se le pasa una cadena número real sin radix en absoluto.

Respuesta

16

No. Ambas tendrán como resultado la llamada a la función interna ToNumber(string).

De ES5 section 15.7.1 (el número Constructor llamar como función):

Cuando Number se llama como una función más que como un constructor, se realiza una conversión de tipo ...

devuelve un número valor (no es un objeto Number) calculado por ToNumber(value) si el valor fue proporcionado, de lo contrario devuelve +0.

De ES5 section 15.1.2.3 (parseFloat (cadena)):

... Si ninguno trimmedString ni ningún prefijo de trimmedString satisface la sintaxis de un StrDecimalLiteral (ver 9.3.1) ...

Y 9.3.1 es la sección titulada "ToNumber aplicado al tipo de cadena", que es a lo que se refiere la primera cita cuando dice ToNumber(value).


actualización (ver comentarios)

llamando al constructor Number con el operador new, 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 section 15.7.2 (el número Constructor):

Cuando Number se llama como parte de una expresión new es un constructor: se inicializa el nuevo objeto creado.

+0

Entonces, ¿qué ocurre si hago 'nuevo Número (...)'? ¿Cómo difiere eso? – Neal

+0

'typeof new Number (3) ===" object "', while 'typeof 3 ===" number "' and 'typeof Number (3) ===" number "' – jackwanders

+0

Obtendrás un objeto Number de nuevo , en comparaciones no estrictas se llamará al método 'valueOf', pero fallarán las comparaciones estrictas con los no objetos. Es una mala idea meterse con objetos 'Number' IMO (y por lo que vale, a Crockford tampoco le gustan) –

0

Cuando no utilice new para crear un objeto contenedor para un valor numérico, Number es relegado a simple hecho de hacer la conversión del tipo de cadena a número.

'parseFloat', por otro lado, como usted ha mencionado, puede analizar un número de coma flotante de cualquier cadena que comienza con un dígito, decimal o +/-

Por lo tanto, si sólo se está trabajando con cadenas que contienen solo valores numéricos, Number(x) y parseFloat(x) dará como resultado los mismos valores

2

No hay mucha diferencia, siempre y cuando esté seguro de que no hay nada más que dígitos en su cadena. Si los hay, Number devolverá NaN.
Otro problema que puede obtener con el constructor Number es que los compañeros de trabajo pueden pensar que olvidó la palabra clave new y agregarla más adelante, lo que hace que las comparaciones estrictas fallen new Number(123) === 123 -> falso, mientras que Number(123) === 123 -> verdadero.

En general, prefiero dejar el constructor Number para lo que es, y sólo tiene que utilizar la sintaxis más corta que hay que emitir a un int/float: +numString o utiliza parse*.

18

El funcionamiento interno no es tan diferente, ya que @James Allardic ya respondió. Hay una diferencia sin embargo. Con parseFloat, una cadena (recortada) que comience con uno o más caracteres numéricos seguidos por caracteres alfanuméricos puede convertirse en un Número, con Number que no tendrá éxito. Como en:

parseFloat('3.23abc'); //=> 3.23 
Number('3.23abc'); //=> NaN 

En ambos conversiones, la cadena de entrada se recorta, por cierto:

parseFloat(' 3.23abc '); //=> 3.23 
Number(' 3.23 '); //=> 3.23 
+0

+1, esto es cierto, pero en las circunstancias definidas en la pregunta, no hay diferencia - "cuando lo pasa una cadena de números reales". Asumiendo que lo he entendido bien de todos modos. –

+0

Otra diferencia es el resultado de '" "' y '" "' donde en ambos casos Number dará '0' pero parseFloat da' NaN'. –

+0

Sé sobre esto. Incluso dije que en OP ...eso es ** no ** lo que estaba preguntando ... – Neal

-1

discúlpenme publicar otra respuesta, pero me acaba de llegar a través de una búsqueda en Google y lo hizo No encuentro todos los detalles que quería. Ejecutar 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 el siguiente resultado:

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 notables: comida para llevar

  1. Si la protección con un if (val) antes de tratar de convertir para numerar, luego parseFloat() devolverá un número excepto en el caso de espacio en blanco.
  2. El número devuelve un número en todos los casos, excepto para los caracteres no numéricos, aparte del espacio en blanco.

Por favor, siéntase libre de agregar cualquier caso de prueba que me pueda faltar.

Cuestiones relacionadas