Déclarer un booléen en JavaScript en utilisant uniquement var

89

Si je déclare une variable booléenne JavaScript comme celle-ci:

var IsLoggedIn;

Et puis initialisez-le avec trueou 1, est-ce sûr? Ou est-ce que l'initialiser avec 1fera de la variable un nombre?

mrblah
la source
27
Cela dépend vraiment de ce que vous entendez par «sûr», il n'y a pas de «sûr» en javascript.
AnthonyWJones

Réponses:

164

Les types dépendent de votre initialisation:

var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool

Mais jetez un œil à cet exemple:

var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean

Le type de vos variables dépend de la valeur attribuée dans JavaScript.

Canavar
la source
1
et si je déclare directement la variable booléenne comme booléenne. est-ce que faire n'importe quelle amélioration de performance
murtaza.webdev
20

Non, ce n'est pas sûr. Vous pourrez plus tard faire var IsLoggedIn = "Foo";et JavaScript ne générera pas d'erreur.

Il est possible de faire

var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);

Vous pouvez également passer la variable non booléenne dans le new Boolean()et cela rendra IsLoggedIn booléen.

var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true
Ólafur Waage
la source
6
N'utilisez pas new Boolean (); IsLoggedIn évaluera à vrai dans toutes ces situations (oui, le nouveau booléen (faux) est vrai).
Miles
@Miles: new Boolean (faux) est faux pas vrai
janvier
5
@jan: if (new Boolean(false)) alert ('wat')Voir stackoverflow.com/a/8695363
Miles
@Miles Incredible, as (new Boolean(false)).toString()) === "false", merci pour le lien
jan
10

Comme le dit ce tutoriel très utile :

var age = 0;

// bad
var hasAge = new Boolean(age);

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;
pavv
la source
probablement aucune explication réelle. personne ne veut passer au peigne fin un tutoriel que vous pourriez spécifier dans un tl; dr dans votre message
Heimi
7

Si vous voulez IsLoggedInêtre traité comme un booléen, vous devez initialiser comme suit:

var IsLoggedIn=true;

Si vous l'initialisez avec, var IsLoggedIn=1;il sera traité comme un entier.

Cependant, à tout moment, la variable IsLoggedInpeut faire référence à un type de données différent:

 IsLoggedIn="Hello World";

Cela ne provoquera pas d'erreur.

zpesk
la source
5

Vous pouvez utiliser et tester des variables non initialisées au moins pour leur «définition». Comme ça:

var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false

De plus, il existe de nombreuses possibilités: si vous n'êtes pas intéressé par les types exacts, utilisez l'opérateur '==' (ou! [Variable] / !! [variable]) pour la comparaison (c'est ce que Douglas Crockford appelle 'vérité' ou ' faux 'je pense). Dans ce cas, l'affectation de true ou 1 ou '1' à la variable unifiée retourne toujours true quand on lui demande. Sinon [si vous avez besoin d'une comparaison sûre de type], utilisez '===' pour la comparaison.

var thisMayBeTrue;

thisMayBeTrue = 1;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false

thisMayBeTrue = '1';
alert(thisMayBeTrue == true); //=> true 
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, in this case, using == or !! '1' is implicitly 
// converted to 1 and 1 is implicitly converted to true)

thisMayBeTrue = true;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> true

thisMayBeTrue = 'true';
alert(thisMayBeTrue == true); //=> false
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, here's no implicit conversion of the string 'true'
// it's also a demonstration of the fact that the 
// ! or !! operator tests the 'definedness' of a variable.

PS: vous ne pouvez pas tester la «définition» pour des variables non existantes. Alors:

alert(!!HelloWorld);

donne une erreur de référence ('HelloWorld n'est pas défini')

(Y a-t-il un meilleur mot pour `` définition ''? Pardonnez-moi quand même mon néerlandais; ~)

KooiInc
la source
Vous voudrez peut-être réessayer vos cas de chaîne avec une chaîne vide thisMayBeTrue = '';- vous n'obtiendrez pas les mêmes résultats car une chaîne vide est fausse. « PS: vous ne pouvez pas test « définition des modèles » pour les variables non existantes si » - Bien sûr , vous pouvez: typeof HellowWorld === 'undefined'.
nnnnnn
2

Les variables en Javascript n'ont pas de type. Non nul, non nul, non vide et truesont "vrais". Zéro, nul, indéfini, chaîne vide et falsesont "faux".

Il existe cependant un type booléen, tout comme les littéraux trueet false.

Eugène Morozov
la source
Les variables JS n'ont pas de type dans le sens où vous ne pouvez pas déclarer une variable qui ne contiendra que des entiers ou des chaînes (comme cela se produit dans d'autres langues), mais la valeur particulière détenue par la variable à un moment donné aura toujours un type. Et le type des questions comme le montre par un exemple simple comme 2 + 2vs "2" + 2. Voir aussi l' typeofopérateur .
nnnnnn
2

Que diriez-vous quelque chose comme ça:

var MyNamespace = {
    convertToBoolean: function (value) {
        //VALIDATE INPUT
        if (typeof value === 'undefined' || value === null) return false;

        //DETERMINE BOOLEAN VALUE FROM STRING
        if (typeof value === 'string') {
            switch (value.toLowerCase()) {
                case 'true':
                case 'yes':
                case '1':
                    return true;
                case 'false':
                case 'no':
                case '0':
                    return false;
            }
        }

        //RETURN DEFAULT HANDLER
        return Boolean(value);
    }
};

Ensuite, vous pouvez l'utiliser comme ceci:

MyNamespace.convertToBoolean('true') //true
MyNamespace.convertToBoolean('no') //false
MyNamespace.convertToBoolean('1') //true
MyNamespace.convertToBoolean(0) //false

Je ne l'ai pas testé pour les performances, mais la conversion de type en type ne devrait pas se produire trop souvent, sinon vous ouvrez votre application à une grande instabilité!

TruMan1
la source
2
Pourquoi voter contre? Veuillez expliquer afin que nous puissions tous en bénéficier.
TruMan1
1

La variable deviendra le type que vous lui attribuez. Au départ, ça l'est undefined. Si vous l'assignez, 'true'il deviendra une chaîne, si vous l'assignez, trueil deviendra un booléen, si vous l'assignez, 1il deviendra un nombre. Les affectations ultérieures peuvent changer le type de la variable ultérieurement.

AnthonyWJones
la source