2010-11-01 32 views

risposta

7

Built-in involucri oggetto (creato con le Boolean, Number, String e Date constuctors) memorizzare il primitivo valore avvolto in una proprietà interna denominata [[PrimitiveValue]], che non può essere cambiato, ma ...

È possibile eseguire l'override del metodo valueOf del vostro test oggetto:

var test = new Boolean(0); 
test.prop = "OK!" 
// override valueOf: 
test.valueOf = function() { return true; }; 

if (test == true) { // using the equals operator explicitly for type conversion 
    alert(test.prop); //"OK!" 
} 

Funzionerà poiché il metodo valueOf è utilizzato internamente dai meccanismi di conversione del tipo attivati ​​dall'operatore di equals.

Quando uno degli operandi è un valore booleano, entrambi vengono convertiti alla fine in Numero.

Se non usiamo l'uguale operatore (ad esempio if (test) { ... }), poiché test è un oggetto, una volta convertito direttamente booleana, sarà sempre resa true.

Qualsiasi oggetto convertito booleana produrrà il valore true, gli unici valori che possono produrre un risultato false, sono i valori "Falsey" (null, undefined, 0, NaN, una stringa vuota, e naturalmente il valore false), qualsiasi altra cosa produrrà true.

Maggiori informazioni:

+0

sebbene la rappresentazione di stringa resta 'false', in quanto il sottostante non è cambiato .. –

+2

@Gaby, beh, dipende da come la conversione di tipo è fatta, per esempio se ti concateni una stringa, es 'test + ''' il risultato sarà ancora ''true'' (' valueOf' sarà usato prima), se si utilizza il costruttore 'String' come funzione, ad es .:' String (test); 'chiamerà il [Metodo '' Boolean.prototype.toString'] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.6.4.2). Sono d'accordo, è una buona idea anche sovrascrivere 'toString'. – CMS

+0

ah molto bello .. ho appena avvisato il valore 'alert (test)' e ha mostrato 'false'. Sembra che il metodo 'alert' usi il costruttore di stringhe o chiama' toString' sui suoi argomenti .. grazie per l'heads up. –

1

No.

var test = new Boolean(0); 

crea un nuovo oggetto e mette un riferimento a esso in 'prova'

test.prop = 'ss' 

mette dinamicamente una nuova proprietà sull'oggetto (meta-programmazione FTW!)

test = true; 

assegna il test a un tipo primitivo booleano. Il riferimento all'oggetto booleano è perso.

Infine, l'oggetto booleano non sembra avere alcun metodo per commutare o riassegnare il suo valore, ad esempio gli oggetti booleani sono immutabili.

Tuttavia, si potrebbe aggiungere un metodo per Boolean.prototype per cambiare la situazione se si voleva ....

0

I wrapper di oggetti creare un tipo di riferimento immutabile nel JS. Poiché in JS i tipi di dati primitivi sono immutabili, i loro riferimenti dovrebbero anche essere immutabili.Potrebbe essere utile per alcuni rari casi, ma molto probabilmente non riuscirà a fare ciò che vuoi. Ad esempio, se è necessario modificare il valore primitivo dell'origine e osservare i riferimenti per seguirlo, non è possibile utilizzare il costruttore Object per ottenere l'effetto desiderato. Quindi la soluzione migliore sarebbe evitare il costruttore Object e utilizzare un vero oggetto letterale per ospitare il tuo valore primitivo sotto una proprietà come segue;

var pv = "test", 
 
    pvr = {0: pv}, 
 
    arr = new Array(5).fill().map(_ => pvr); 
 
console.log(JSON.stringify(arr)); 
 
pvr[0] = "Hello"; 
 
console.log(JSON.stringify(arr));

Problemi correlati