Dichiarare un valore booleano in JavaScript usando solo var
-
19-08-2019 - |
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?
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.