2009-05-13 16 views

risposta

56

La funzione globale Boolean() può essere utilizzato per l'inserimento dei tipi quando viene chiamato senza new, ad esempio

var foo = Boolean(bar); // equivalent to `var foo = !!bar` 

Quando chiamato con new, un oggetto involucro viene creato in aggiunta, il che significa che è possibile assegnare proprietà arbitrarie sul oggetto:

var foo = new Boolean(bar); // equivalent to `var foo = Object(Boolean(bar));` 
foo.baz = 'quux'; 
alert(foo.baz); 

Questo non è possibile con i valori di base come primitivi non possono contenere proprietà:

var foo = true; 
foo.baz = 'quux'; 
alert(foo.baz); // `foo.baz` is `undefined` 

Assegnazione di un immobile ad un primitivo non produce un errore a causa di auto-boxing, cioè

foo.baz = 'quux'; 

sarà interpretato come

// create and immediately discard a wrapper object: 
(new Boolean(foo)).baz = 'quux'; 

Per ottenere il valore di base indietro, Dovrò richiamare il metodo valueOf(). Ciò è necessario se si desidera utilizzare effettivamente il valore spostato, poiché gli oggetti vengono sempre valutati su true in contesti booleani, anche se il valore inserito è false.

Non ho mai trovato un'applicazione utile per poter assegnare proprietà ai booleani, ma la boxe potrebbe essere utile nei casi in cui è necessario un riferimento a un valore primitivo.

+1

Chiamare booleano (alcuniVar) può essere utile per eseguire il cast su un primitivo booleano, ma ricorda che Booleano (false) == false, ma new Boolean (false) == true, perché è un oggetto – jackocnr

+0

Non è sempre necessario utilizzare 'valueOf' - verrà chiamato automaticamente quando è necessaria una primitiva. Ad esempio, 'boolean_object === true' costringerà l'oggetto alla sua primitiva sottostante (ma'! Boolean_object' non lo farà). –

+1

@torazaburo: '===' non coerce - 'new Boolean (true) === true' è false – Christoph

17

Mentre altri hanno menzionato la teoria, vorrei parlare della parte pratica:

perché Boolean oggetti (come oggetti in generale) sono sempre truthy, si ritiene una cattiva pratica di usarli. In molti anni di programmazione JS, non li ho mai usati, e non ricordo di aver visto neanche i codici Boolean nel codice di altre persone. Neanche una volta.

L'utilizzo di valori primitivi eviterà la confusione e renderà il tuo codice un po 'più breve.

Se hai bisogno di un bool avvolto in un oggetto, si potrebbe anche usare un oggetto Object in questo modo:

foo = { value: false }; 

Inoltre, chiamando il Boolean() costruttore come una funzione (come in foo = Boolean(bar)) ha lo stesso effetto come typecasting esplicito usando !!, e quest'ultimo è generalmente preferito rispetto al primo.

+1

Hai rivendicato una preferenza generale per una coppia di operatori * not * !!'. Ma lo scopo e l'effetto di '!!' sembra meno ovvio rispetto al convenzionale convertitore 'Boolean()' e mi chiedo se la chiarezza del codice sia una preoccupazione qui. –

6

Le rocce di classe booleana. Invece di questo spaghetti code:

if (foo===true) this.launch(); 
else this.dontLaunch(); 

Si può fare quello che qualsiasi grande programmatore avrebbe fatto ed estendere il prototipo!

Boolean.prototype.ifTrue=function(ifFunc,elseFunc){ 
    if (this.valueOf()===true) ifFunc(); 
    else elseFunc(); 
} 
var foo=new Boolean(/*expression*/); 
foo.ifTrue(this.launch.bind(this),this.dontLaunch.bind(this)); 

Molto meglio ora.

+6

A volte preferisco l'espressione? this.launch(): this.dontLaunch() 'Pensa che il tuo secondo esempio sia ancora peggio spaghetti – Endless

+2

Bene il prototipo Booleans sarebbe stato esteso nella parte superiore del file, il foo sarebbe stato dichiarato nel punto in cui le variabili sono state dichiarate, e i metodi ifTrue sarebbero eseguiti laddove appropriato. Ad ogni modo --- questa risposta non è seria. Una sorta di satira sulla programmazione funzionale e sull'estensione del prototipo. –

+0

Che meraviglia! Seguirà questa pratica da ora in poi :) – mlvljr

-1

Domanda interessante:

utilizzare New booleana per creare un oggetto booleano. Ci possono essere molti scenari ma ho discusso sotto uno scenario.

Supponiamo di volere un confronto nel codice in cui si desidera confrontare il valore di stringa e il relativo tipo di dati e deve eseguire il bool (vero/falso), quindi si utilizzerà il nuovo booleano invece di assegnare un valore falso semplice.

var flag = false; 
var flag2 = new Boolean (false); 
alert(typeof flag); //boolean object 
alert(typeof flag2); //simple object 

if (flag === flag2){ 
    alert("Value and datatype match"); 
} 
else{ 
    alert("Value and datatype do not match"); 
} 
0

Prima che la domanda di cui sopra prima la funzione booleana, Boolean()

Boolean(10 > 4) // return true 
Boolean(4 > 9) // return false 

successivo: tutto con ritorno reale valore vero. Per esempio

100 
-4 
4.4 
"hello" 
"false" // note even the string value false return true. 

everthing senza reale valore return false per esempio

NaN 
var x = 10/"H"; // Boolean(x); return false. 
undefined 
"" 
0 
-0 
false 
null 

Ora l'oggetto Boolean è un wrapper oggetto per un valore booleano. Il valore passato come il primo parametro viene convertito in un valore booleano, se necessario. Se il valore è omesso o è 0, -0, null, false, NaN, undefined o la stringa vuota (""), l'oggetto ha un valore iniziale falso. Tutti gli altri valori, incluso qualsiasi oggetto o stringa "false", creano un oggetto con un valore iniziale di true.

Ciò consente trucchi molto potenti.

Problemi correlati