Dichiarare un booleano in JavaScript usando solo var


89

Se dichiaro una variabile booleana JavaScript come questa:

var IsLoggedIn;

E poi inizializzalo con trueo 1, è sicuro? O l'inizializzazione con 1renderà la variabile un numero?


27
Dipende davvero da cosa intendi per "sicuro", non esiste "sicuro" in javascript.
AnthonyWJones

Risposte:


164

I tipi dipendono dalla tua inizializzazione:

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

Ma dai un'occhiata a questo esempio:

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

Il tipo di variabili dipende dal valore assegnato in JavaScript.


1
cosa succede se dichiari direttamente la variabile booleana come booleana. è che migliora qualsiasi performance
murtaza.webdev

20

No, non è sicuro. Successivamente potresti eseguire var IsLoggedIn = "Foo";e JavaScript non genererà un errore.

È possibile farlo

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

Puoi anche passare la variabile non booleana in new Boolean()e renderà IsLoggedIn booleano.

var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true

6
Non utilizzare new Boolean (); IsLoggedIn restituirà true in tutte queste situazioni (sì, new Boolean (false) è true).
Miglia

@Miles: new Boolean (false) is false not true
jan

5
@jan: if (new Boolean(false)) alert ('wat')See stackoverflow.com/a/8695363
Miles

@Miles Incredible, as (new Boolean(false)).toString()) === "false", thanks for the link
Jan

10

Come dice questo tutorial molto utile :

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

probabilmente nessuna vera spiegazione. nessuno vuole sfogliare un tutorial che potresti specificare in un tl; dr nel tuo post
Heimi

7

Se vuoi IsLoggedInessere trattato come booleano dovresti inizializzare come segue:

var IsLoggedIn=true;

Se lo si inizializza con var IsLoggedIn=1;, verrà trattato come un numero intero.

Tuttavia in qualsiasi momento la variabile IsLoggedInpotrebbe fare riferimento a un diverso tipo di dati:

 IsLoggedIn="Hello World";

Ciò non causerà un errore.


5

È possibile utilizzare e testare variabili non inizializzate almeno per la loro "definizione". Come questo:

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

Inoltre, ci sono molte possibilità: se non sei interessato ai tipi esatti usa l'operatore '==' (o! [Variabile] / !! [variabile]) per il confronto (questo è ciò che Douglas Crockford chiama 'verità' o ' falsy 'credo). In tal caso, l'assegnazione di true o 1 o "1" alla variabile unitializzata restituisce sempre true quando richiesto. Altrimenti [se hai bisogno di un confronto sicuro dei tipi] usa '===' per il confronto.

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: non puoi testare la "definizione" per variabili inesistenti. Così:

alert(!!HelloWorld);

restituisce un errore di riferimento ("HelloWorld non è definito")

(esiste una parola migliore per 'definizione'? Perdonate comunque il mio olandese; ~)


Potresti provare a ripetere i casi di stringa con una stringa vuota thisMayBeTrue = '';: non otterrai gli stessi risultati poiché una stringa vuota è falsa. "PS: non è possibile test 'definedness' per inesistente variabili però" - Certo che puoi: typeof HellowWorld === 'undefined'.
nnnnnn

2

Le variabili in Javascript non hanno un tipo. Diverso da zero, non nullo, non vuoto e truesono "veri". Zero, null, undefined, stringa vuota e falsesono "false".

C'è un tipo booleano, così come i letterali truee false.


Le variabili JS non hanno un tipo, nel senso che non puoi dichiarare una variabile che conterrà solo interi o stringhe (come accade in alcuni altri linguaggi), ma il valore particolare detenuto dalla variabile in un dato momento avrà sempre un tipo. E il tipo di questioni, come possono essere visualizzati con un semplice esempio come 2 + 2vs "2" + 2. Vedi anche l' typeofoperatore .
nnnnnn

2

Che ne dici di qualcosa del genere:

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

Quindi puoi usarlo in questo modo:

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

Non l'ho testato per le prestazioni, ma la conversione da tipo a tipo non dovrebbe avvenire troppo spesso altrimenti apri la tua app fino a instabilità alla grande!


2
Perché il voto negativo? Si prega di spiegare in modo che tutti possiamo trarne vantaggio.
TruMan1

1

La variabile diventerà il tipo che le assegni. Inizialmente lo è undefined. Se lo assegni 'true'diventerà una stringa, se lo assegni truediventerà un booleano, se lo assegni 1diventerà un numero. Le assegnazioni successive possono modificare il tipo della variabile in un secondo momento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.