Si declaro una variable booleana de JavaScript como esta:
var IsLoggedIn;
Y luego inicializarlo con true
o 1
, ¿es seguro? ¿O inicializarlo con 1
hará que la variable sea un número?
Si declaro una variable booleana de JavaScript como esta:
var IsLoggedIn;
Y luego inicializarlo con true
o 1
, ¿es seguro? ¿O inicializarlo con 1
hará que la variable sea un número?
Respuestas:
Los tipos dependen de su inicialización:
var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool
Pero mire este ejemplo:
var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean
El tipo de sus variables depende del valor asignado en JavaScript.
No, no es seguro. Más tarde, podría hacer var IsLoggedIn = "Foo";
y JavaScript no arrojará un error.
Es posible hacer
var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);
También puede pasar la variable no booleana al new Boolean()
y hará que IsLoggedIn sea 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
if (new Boolean(false)) alert ('wat')
Ver stackoverflow.com/a/8695363
(new Boolean(false)).toString()) === "false"
, gracias por el enlace
Como dice este tutorial muy útil :
var age = 0;
// bad
var hasAge = new Boolean(age);
// good
var hasAge = Boolean(age);
// good
var hasAge = !!age;
Si desea IsLoggedIn
ser tratado como un booleano, debe inicializar de la siguiente manera:
var IsLoggedIn=true;
Si lo inicializa con var IsLoggedIn=1;
, se tratará como un número entero.
Sin embargo, en cualquier momento, la variable IsLoggedIn
podría referirse a un tipo de datos diferente:
IsLoggedIn="Hello World";
Esto no provocará ningún error.
Usted puede usar y probar las variables sin inicializar al menos por su 'definedness'. Me gusta esto:
var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
Además, hay muchas posibilidades: si no está interesado en los tipos exactos, use el operador '==' (o! [Variable] / !! [variable]) para comparar (eso es lo que Douglas Crockford llama 'verdadero' o ' falso ', creo). En ese caso, asignar verdadero o 1 o '1' a la variable unitaria siempre devuelve verdadero cuando se le pregunta. De lo contrario, [si necesita una comparación segura de tipos] use '===' para comparar.
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.
PD: sin embargo, no se puede probar la 'definición' para las variables inexistentes. Entonces:
alert(!!HelloWorld);
da un error de referencia ('HelloWorld no está definido')
(¿Hay una palabra mejor para 'definición'? Perdón por mi holandés de todos modos; ~)
thisMayBeTrue = '';
; no obtendrá los mismos resultados ya que una cadena vacía es falsa. "PD: no se puede test 'definedness' para las variables no existentes aunque" - Claro que puedes: typeof HellowWorld === 'undefined'
.
Las variables en Javascript no tienen un tipo. No cero, no nulo, no vacío y true
son "verdaderos". Cero, nulo, indefinido, cadena vacía yfalse
son "falsos".
Sin embargo, hay un tipo booleano, al igual que los literales true
y false
.
2 + 2
vs "2" + 2
. Consulte también el typeof
operador .
Qué tal algo como esto:
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);
}
};
Entonces puedes usarlo así:
MyNamespace.convertToBoolean('true') //true
MyNamespace.convertToBoolean('no') //false
MyNamespace.convertToBoolean('1') //true
MyNamespace.convertToBoolean(0) //false
No he probado su rendimiento, pero la conversión de un tipo a otro no debería suceder con demasiada frecuencia, de lo contrario, ¡abrirás tu aplicación a la inestabilidad a lo grande!
La variable se convertirá en el tipo que le asigne. Inicialmente lo es undefined
. Si lo asigna se 'true'
convertirá en una cadena, si lo asigna se true
convertirá en un booleano, si lo asigna se 1
convertirá en un número. Las asignaciones posteriores pueden cambiar el tipo de la variable más adelante.