使用var声明一个布尔值

如果我声明一个JavaScript布尔variables像这样:

var IsLoggedIn; 

然后用true或者1初始化它,是安全的吗? 或者将初始化1使variables数字?

types依赖于您的初始化:

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

但看看这个例子:

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

您的variables的types取决于JavaScript中的赋值。

不,这是不安全的。 你以后可以做var IsLoggedIn = "Foo"; 和JavaScript不会抛出一个错误。

这是可能的

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

您也可以将非布尔variables传递给new Boolean() ,它将使IsLoggedIn布尔值。

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

如果你想IsLoggedIn被视为一个布尔值,你应该初始化如下:

 var IsLoggedIn=true; 

如果你用var IsLoggedIn=1;初始化它, 那么它将被视为一个整数。

但是,在任何时候,variablesIsLoggedIn都可以引用不同的数据types:

  IsLoggedIn="Hello World"; 

这不会导致错误。

由于这个非常有用的教程说:

 var age = 0; // bad var hasAge = new Boolean(age); // good var hasAge = Boolean(age); // good var hasAge = !!age; 

可以至less为其“定义”使用和testing未初始化的variables。 喜欢这个:

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

此外,还有很多可能性:如果您对确切types不感兴趣,请使用'=='运算符(或![variable] / !! [variable])进行比较(这就是Douglas Crockford所说的“truthy”或“麻烦“我认为)。 在这种情况下,如果将true或1或1分配给单位variables,则在询问时始终返回true。 否则[如果您需要types安全比较]使用'==='进行比较。

 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:虽然你不能testing不存在的variables的“定义”。 所以:

 alert(!!HelloWorld); 

给出一个引用Error('HelloWorld is not defined')

(对于“定义”有没有更好的说法呢?不pipe怎么说,我的荷兰人也是这样对待的)

Javascript中的variables没有types。 非零,非空,非空和true “真”。 零,空,未定义,空string和false是“假”。

虽然有一个布尔types,文字是true也是false

该variables将成为您分配它的types。 最初它是undefined 。 如果将其赋值为'true'则它将变成一个string,如果将其赋值为true则它将变为布尔值,如果将其赋值为1 ,则变成一个数字。 随后的分配可能会稍后改变variables的types。

怎么样这样的事情:

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

那么你可以像这样使用它:

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

我没有testing它的性能,但是从types到types的转换不应该经常发生,否则你打开你的应用程序到不稳定的大时间!