Domanda

Se dichiaro una variabile booleana JavaScript come questa:

var IsLoggedIn;

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

È stato utile?

Soluzione

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.

Altri suggerimenti

No, non è sicuro. In seguito potresti fare 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 nel new Boolean () e IsLoggedIn renderà 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

Come questo tutorial molto utile dice:

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

Se vuoi che IsLoggedIn sia trattato come un valore booleano devi inizializzare come segue:

var IsLoggedIn=true;

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

Tuttavia, in qualsiasi momento la variabile IsLoggedIn potrebbe riferirsi a un diverso tipo di dati:

 IsLoggedIn="Hello World";

Ciò non causerà un errore.

Puoi puoi usare e testare variabili non inizializzate almeno per la loro "definizione". In questo modo:

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 'penso). In tal caso, assegnare 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. Quindi:

alert(!!HelloWorld);

fornisce un errore di riferimento ('HelloWorld non è definito')

(c'è una parola migliore per "definizione"? Scusatemi comunque il mio olandese; ~)

Le variabili in Javascript non hanno un tipo. Non zero, non null, non vuoto e true sono " true " ;. Zero, null, undefined, stringa vuota e false sono " false " ;.

Esiste però un tipo booleano, così come i letterali true e false .

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 si apre la tua app all'instabilità alla grande!

La variabile diventerà qualsiasi tipo di assegnazione. Inizialmente è undefined . Se lo assegni 'true' diventerà una stringa, se lo assegni true diventerà un valore booleano, se lo assegni 1 diventerà un numero. Le assegnazioni successive possono modificare il tipo di variabile in un secondo momento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top