2011-01-18 23 views
37

¿Cuál es la diferencia entre new Number() y Number()? Obtuve que new Number() crea un objeto Number y Number() es solo una función, pero ¿cuándo debo llamar a cuál, y por qué?nuevo Número() vs Número()

En una nota relacionada, Mozilla dice:

Do not use a Boolean object to convert a non-boolean value to a boolean value. Instead, use Boolean as a function to perform this task. 

x = Boolean(expression);  // preferred 
x = new Boolean(expression); // don't use 

¿Por qué? Pensé que los resultados eran los mismos?

Respuesta

40

Boolean(expression) será simplemente convertir la expresión en una boolean valor primitivo, mientras new Boolean(expression) va a crear una envoltura de objeto alrededor del valor booleano convertido.

La diferencia se puede ver con esto:

// Note I'm using strict-equals 
new Boolean("true") === true; // false 
Boolean("true") === true; // true 

Y con esto (gracias @hobbs):

typeof new Boolean("true"); // "object" 
typeof Boolean("true"); // "boolean" 

Nota: Mientras que el objeto envoltorio obtendrá convertida a la primitiva automáticamente cuando sea necesario (y viceversa), solo hay un caso en el que podría pensar dónde desea usar new Boolean, o cualquiera de las otras r envoltorios para primitivos: si desea adjuntar propiedades a un solo valor. E.g:

var b = new Boolean(true); 
b.relatedMessage = "this should be true initially"; 
alert(b.relatedMessage); // will work 

var b = true; 
b.relatedMessage = "this should be true initially"; 
alert(b.relatedMessage); // undefined 
+3

y 'typeof (Boolean (" true ")) ===" boolean "', mientras que 'typeof (new Boolean (" true ")) ===" object "'. – hobbs

+4

"Mientras que el objeto contenedor se convertirá a la primitiva automáticamente cuando sea necesario" Eso es cierto, pero un tanto engañoso. Los objetos (incluidos los objetos 'Boolean') siempre evalúan a' true' en un contexto booleano: 'if (new Boolean (0)) {alert (" Oops, 0 is true. "); } ' Para obtener el valor "esperado", llame a 'valueOf':' new Boolean (0) .valueOf() === false' –

25
new Number(x) 

crea un nuevo objeto de envoltura. No creo que haya una razón válida para usar esto alguna vez.

Number(x) 

convierte el argumento pasado en un valor numérico. Puede usar esto para convertir alguna variable al tipo Número. Sin embargo, este recibe el mismo trabajo:

+x 

general:

No es necesario los:

new Number() 
new String() 
new Boolean() 

los puedes utilizar para la fundición:

Number(value) 
String(value) 
Boolean(value) 

Sin embargo, hay soluciones más simples para el reparto ing:

+x // cast to Number 
'' + x // cast to String 
!!x // cast to Boolean 
+12

Sus abreviaturas pueden ser _simpler_, pero no son tan claras como usar las funciones Number/String/Boolean para hacer lo mismo. – Nigel

+3

@Nigel True, pero entre los programadores de JavaScript, el prefijo '+' para la coerción numérica es común y (por lo que puedo ver) preferido. –

14

Siempre vale la pena consultar the spec; de la Sección 15.7.1:

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

De forma similar, usando Boolean como una función (15.6.1):

Cuando se llama a Boolean como una función en lugar de como un constructor, realiza una conversión de tipo.

... lo que significa que consulte la Sección 9.2 ("ToBoolean"):

La operación abstracta ToBoolean convierte su argumento a un valor de tipo booleano acuerdo con la Tabla 11:
Undefined = false
Null = false
Boolean = El resultado es igual al argumento de entrada (sin conversión).
Number = El resultado es falso si el argumento es +0, -0 o NaN; de lo contrario, el resultado es verdadero.
String = El resultado es falso si el argumento es la cadena vacía (su longitud es cero); de lo contrario, el resultado es verdadero.
Object = true

La diferencia entre new Boolean(value) y Boolean(value) es básicamente que los ex devuelve un objeto, pero éste vuelve una primitiva por lo anterior. Este importa, ya que los objetos son Truthy:

var b = new Boolean(false); 

display(b);   // Displays "false" 
if (b) { 
    display("true");  // This is the path that gets taken, displaying "true" 
} 
else { 
    display("false"); // This path does NOT get taken 
} 

Live example ... mientras que casi siempre se desea booleanos con el fin de ponerlos a prueba.

Cuestiones relacionadas