web-dev-qa-db-fra.com

Quel est le but de new Boolean () en Javascript?

Quelle est l'utilisation de:

var flag = new Boolean(false); 

par rapport à:

var flag = false;

Quand utiliseriez-vous réellement new Boolean?

53
zeroin23

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.

61
Christoph

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 Booleans 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.

19
user123444555621

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. 

3
Nick Manning

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.

0
Lawrence Oputa