Quelle est l'utilisation de:
var flag = new Boolean(false);
par rapport à:
var flag = false;
Quand utiliseriez-vous réellement new Boolean
?
La fonction globale Boolean()
peut être utilisée pour le transtypage lorsque appelé sans new
, par exemple
var foo = Boolean(bar); // equivalent to `var foo = !!bar`
Lorsqu'il est appelé avec new
, un objet wrapper est également créé, ce qui signifie que vous pouvez affecter des propriétés arbitraires à l'objet:
var foo = new Boolean(bar); // equivalent to `var foo = Object(Boolean(bar));`
foo.baz = 'quux';
alert(foo.baz);
Ce n'est pas possible avec les valeurs primitives, car les primitives ne peuvent pas contenir de propriétés:
var foo = true;
foo.baz = 'quux';
alert(foo.baz); // `foo.baz` is `undefined`
L'affectation d'une propriété à une primitive ne génère pas d'erreur en raison de la boxe automatique, c'est-à-dire
foo.baz = 'quux';
sera interprété comme
// create and immediately discard a wrapper object:
(new Boolean(foo)).baz = 'quux';
Pour récupérer la valeur primitive, vous devez invoquer la méthode valueOf()
. Cela est nécessaire si vous voulez réellement utiliser la valeur renvoyée, car les objets sont toujours évalués à true
dans les contextes booléens, même si la valeur renvoyée est false
.
Je n'ai jamais trouvé d'application utile de pouvoir affecter des propriétés à des booléens, mais la boxe peut être utile dans les cas où une référence à une valeur primitive est nécessaire.
Alors que d'autres ont mentionné la théorie, laissez-moi parler de la partie pratique:
Étant donné que les objets Boolean
(en tant qu’objets en général) sont toujours véridiques, il est considéré comme une mauvaise pratique de les utiliser. Au cours de nombreuses années de programmation JS, je ne les ai jamais utilisées et je ne me souviens pas non plus d'avoir vu Boolean
s dans le code d'autres personnes. Pas même une fois.
L'utilisation de valeurs primitives évitera la confusion et rendra votre code un peu plus court.
Si vous avez besoin d'un objet booléen, vous pouvez également utiliser un objet Object
comme ceci:
foo = { value: false };
De plus, l'appel du constructeur Boolean()
en tant que fonction (comme dans foo = Boolean(bar)
) a le même effet que le transtypage de texte explicite utilisant !!
, ce dernier étant généralement préféré au premier.
La classe booléenne bascule. Au lieu de ce code spaghetti ????:
if (foo===true) this.launch();
else this.dontLaunch();
Vous pouvez faire ce que tout bon programmeur ferait et étendre le prototype!
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));
Bien mieux maintenant.
Avant la question ci-dessus, la fonction booléenne, Boolean ()
Boolean(10 > 4) // return true
Boolean(4 > 9) // return false
Suivant: tout ce qui a une valeur réelle retourne vrai. Par exemple
100
-4
4.4
"hello"
"false" // note even the string value false return true.
tout ce qui n'a pas de valeur réelle renvoie false E.g
NaN
var x = 10 / "H"; // Boolean(x); return false.
undefined
""
0
-0
false
null
Désormais, l'objet Boolean
est un encapsuleur pour une valeur booléenne. La valeur transmise comme premier paramètre est convertie en une valeur booléenne, si nécessaire. Si la valeur est omise ou est 0, -0, null, false, NaN, undefined
ou la chaîne vide (""
), la valeur initiale de l'objet est false. Toutes les autres valeurs, y compris tout objet ou la chaîne "false", créent un objet avec une valeur initiale de true.
Cela permet des astuces très puissantes.