2010-03-04 13 views
7

En Javascript, uno de los reliable ways to convert a string to a number es el Number constructor:¿Cuál es la diferencia entre "nuevo número (...)" y "número (...)" en JavaScript?

var x = Number('09'); // 9, because it defaults to decimal 

Inspirado por this question, empecé a preguntarme — ¿cuál es la diferencia entre lo anterior y:

var x =new Number('09'); 

Number sin duda se ve mejor, pero parece un uso ligeramente inapropiado de un constructor. ¿Hay algún efecto secundario o alguna diferencia al usarlo sin el nuevo? Si no hay diferencia, ¿por qué no? ¿Cuál es el propósito de nuevo?

Respuesta

10

En el primer caso, se utiliza el Number Constructor Called as a Function, como se describe en la especificación, que simplemente realizar una conversión de tipo, el retorno de una Number primitivo.

En el segundo caso, se utiliza el Number Constructor para hacer un objeto Number:

var x = Number('09'); 
typeof x; // 'number' 

var x = new Number('09'); 
typeof x; // 'object' 

Number('1') === new Number('1'); // false 

La diferencia puede ser sutil, pero creo que es importante tener en cuenta cómo los objetos envoltorio actuar sobre primitiva valores.

+1

Para ser justos, 'nuevo número ('1') === nuevo número ('1')' también es 'falso', pero estoy de acuerdo con usted :) –

+1

Derecho, porque eso comparará dos objetos diferentes referencias. – CMS

+0

@Richard Szalay - pero, 'Number ('1') === Number ('1')' es 'true', que ilustra el punto @ CMS. – Nicole

0

SpiderMonkey-1.7.0:

js> typeof new Number('09'); 
object 
js> typeof Number('09'); 
number 
4

Number devuelve un valor numérico primitivo. Sí, es un poco extraño que puedas usar una función de constructor como una función simple también, pero así es como se define JavaScript. La mayoría de los tipos incorporados en el lenguaje tienen funciones adicionales extrañas e incoherentes como esta.

new Number construye un objeto Number en caja explícito. La diferencia:

typeof Number(1)  // number 
typeof new Number(1) // object 

A diferencia de clases primitivas en caja de Java, JavaScript explícitas en Number objetos son de absolutamente ningún uso.

No me molestaría con el uso de Number. Si quiere ser explícito, use parseFloat('09'); si quiere ser concisa, use +'09'; si desea permitir solo enteros, use parseInt('09', 10).

+0

+1, desearía poder aceptar dos respuestas como correctas, ya que ambas son totalmente correctas y contienen información útil única. No sabía sobre usar '+' sin ningún número anterior. – Nicole

0

El número (sin nuevo) no parece dar como resultado exactamente una primitiva. En el siguiente ejemplo, se llama anyMethod() (si está en el prototipo de Número).

Number(3).anyMethod() 

Mientras

3.anyMethod() 

no va a funcionar.

Cuestiones relacionadas