2010-11-01 4 views

Répondre

7

intégré dans des emballages d'objets (créé avec les Boolean, Number, String et Date constuctors) stocker la primitive valeur enveloppé dans une propriété interne nommée [[PrimitiveValue]], qui ne peut être changé, mais ...

Vous pouvez remplacer la méthode valueOf de votre objet test:

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!" 
} 

Cela fonctionnera puisque la méthode valueOf est utilisée en interne par les mécanismes de conversion de type déclenchés par l'opérateur égal. Lorsque l'un des opérandes est une valeur booléenne, les deux sont convertis à la fin en Nombre.

Si nous n'utilisons l'opérateur equals (par exemple if (test) { ... }), puisque test est un objet, il sera toujours lorsqu'il est converti directement à Boolean rendement true.

Tout objet converti en Boolean produira la valeur true, les seules valeurs qui peuvent produire un résultat false, sont les valeurs « Falsey » (null, undefined, 0, NaN, une chaîne vide, et bien sûr la valeur false), toute autre chose produira true.

Plus d'infos:

+0

bien que la représentation de la chaîne reste à 'false', puisque la valeur sous-jacente n'a pas vraiment changé .. –

+2

@Gaby, eh bien, cela dépend de la façon dont est fait la conversion de type, par exemple, si vous lui concaténez une chaîne, par exemple 'test + ''' le résultat sera toujours '' true'' ('valueOf' sera utilisé en premier), si vous utilisez le constructeur' String' en tant que fonction, par exemple: 'String (test); Méthode [Boolean.prototype.toString] (http://ecma262-5.com/ELS5_HTML.htm#Section_15.6.4.2). Je suis d'accord, c'est une bonne idée de surcharger 'toString' aussi. – CMS

+0

ah très gentil .. je viens d'alerter la valeur 'alert (test)' et il a montré 'false'. On dirait que la méthode 'alert' utilise le constructeur String ou appelle' toString' sur ses arguments .. merci pour les heads up. –

1

n °

var test = new Boolean(0); 

crée un nouvel objet et met une référence dans 'test'

test.prop = 'ss' 

met dynamiquement une nouvelle propriété sur l'objet (méta-programmation FTW!)

test = true; 

affecte un test à un type primitif booléen. La référence à l'objet booléen est perdue. Enfin, l'objet booléen ne semble pas avoir de méthode pour basculer ou réaffecter sa valeur, c'est-à-dire que les objets booléens sont immuables.

Cependant, vous pouvez ajouter une méthode pour Boolean.prototype changer que si vous vouliez ....

0

Les enveloppes d'objet de créer un type de référence immuable dans JS. Puisque dans JS les types de données primitifs sont immuables, leurs références devraient également être immuables.Cela peut être utile dans certains cas rares mais probablement ne pas faire ce que vous voulez. Par exemple, si vous devez modifier la valeur de la primitive source et regarder les références à suivre, vous ne pouvez pas utiliser le constructeur Object pour obtenir l'effet désiré. Alors votre meilleur pari serait d'éviter le constructeur Object et d'utiliser un littéral d'objet approprié pour abriter votre valeur primitive sous une propriété comme suit;

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));

Questions connexes