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:
sebbene la rappresentazione di stringa resta 'false', in quanto il sottostante non è cambiato .. –
@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
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. –