2011-01-18 14 views
37

Qual è la differenza tra new Number() e Number()? Ho capito che new Number() crea un oggetto Number e Number() è solo una funzione, ma quando dovrei chiamare quale e perché?nuovo Numero() vs Numero()

In una nota correlata, 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 

Perché? Pensavo che i risultati fossero gli stessi?

risposta

40

Boolean(expression) sarà semplicemente convertire l'espressione in un booleano valore di base, mentre new Boolean(expression) creerà un oggetto wrapper intorno al valore booleano convertito.

La differenza può essere visto con questo:

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

E anche con questo (@hobbs grazie):

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

Nota: Mentre l'oggetto wrapper otterrà convertito alla primitiva automaticamente quando necessario (e viceversa), c'è solo un caso in cui posso pensare a dove vorresti usare new Boolean o qualsiasi altra r wrapper per primitive - se si desidera associare le proprietà a un singolo valore. 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

e 'typeof (Boolean (" true ")) ===" boolean "', mentre 'typeof (new Boolean (" true ")) ===" oggetto "'. – hobbs

+4

"Mentre l'oggetto wrapper viene convertito automaticamente alla primitiva quando necessario" È vero, ma in qualche modo fuorviante. Gli oggetti (compresi gli oggetti 'Boolean') valutano sempre' true' in un contesto booleano: 'if (new Boolean (0)) {alert (" Oops, 0 è true. "); } '. Per ottenere il valore "previsto", chiama 'valueOf':' new Boolean (0) .valueOf() === false' –

25
new Number(x) 

crea un nuovo oggetto wrapper. Non penso che ci sia una ragione valida per usarlo mai.

Number(x) 

converte l'argomento passato in un valore Numero. Puoi usarlo per lanciare alcune variabili sul tipo Numero. Tuttavia, questo ottiene lo stesso lavoro fatto:

+x 

generale:

Non hai bisogno di quelle:

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

È possibile utilizzare quelli per casting:

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

Tuttavia, ci sono soluzioni più semplici per il cast ing:

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

Le tue stenografie possono essere _simpler_, ma non sono chiare come utilizzare le funzioni Number/String/Boolean per fare la stessa cosa. – Nigel

+3

@Nigel Vero, ma tra i programmatori JavaScript, il prefisso '+' per la forzatura numerica è comune e (da quello che posso vedere) preferito. –

14

Da consultare sempre the spec; da Sezione 15.7.1:

Quando Number viene chiamato come funzione anziché come costruttore, esegue una conversione di tipo.

Analogamente, utilizzando Boolean come una funzione (15.6.1):

Quando booleano viene chiamato come funzione anziché come costruttore, esegue una conversione di tipo.

... il che significa che si consulti Sezione 9.2 ("ToBoolean"):

L'operazione astratta ToBoolean converte il suo argomento a un valore di tipo booleano in base alla Tabella 11:
Undefined = false
Null = false
Boolean = il risultato uguale all'argomento dato (senza conversione).
Number = Il risultato è false se l'argomento è +0, -0 o NaN; altrimenti il ​​risultato è vero.
String = Il risultato è false se l'argomento è la stringa vuota (la sua lunghezza è zero); altrimenti il ​​risultato è vero.
Object = true

La differenza tra new Boolean(value) e Boolean(value) è fondamentalmente che il primo restituisce un oggetto, ma quest'ultimo ritorna una primitiva per quanto sopra. Questo conta, perché gli oggetti sono 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 ... mentre si vuole quasi sempre booleani allo scopo di testarli.