使用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的转换不应该经常发生,否则你打开你的应用程序到不稳定的大时间!