如果我声明一个像这样的JavaScript布尔变量:
var IsLoggedIn;
然后使用true
或1
初始化它,这样安全吗?或者用1
初始化它使变量成为数字?
答案 0 :(得分:157)
类型取决于您的初始化:
var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool
但请看一下这个例子:
var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean
您的变量类型取决于JavaScript中的指定值。
答案 1 :(得分:20)
不,这不安全。您以后可以执行var IsLoggedIn = "Foo";
,JavaScript不会抛出错误。
可以做
var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);
您还可以将非布尔变量传递给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
答案 2 :(得分:8)
正如very useful tutorial所说:
var age = 0;
// bad
var hasAge = new Boolean(age);
// good
var hasAge = Boolean(age);
// good
var hasAge = !!age;
答案 3 :(得分:7)
如果您希望将IsLoggedIn
视为布尔值,则应按如下方式初始化:
var IsLoggedIn=true;
如果使用var IsLoggedIn=1;
对其进行初始化,则会将其视为整数。
但是,变量IsLoggedIn
可以随时引用不同的数据类型:
IsLoggedIn="Hello World";
这不会导致错误。
答案 4 :(得分:5)
你可以至少为其“定义”使用和测试未初始化的变量。 像这样:
var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
此外,还有很多可能性:如果你对确切的类型不感兴趣,可以使用'=='运算符(或![variable] / !! [variable])进行比较(这就是Douglas Crockford所说的'truthy' '或'falsy'我认为)。在这种情况下,为单位化变量赋值true或1或'1'在被询问时始终返回true。否则[如果你需要类型安全比较]使用'==='进行比较。
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:你不能测试不存在的变量的'定义'。所以:
alert(!!HelloWorld);
给出引用错误('HelloWorld未定义')
(对于'定义'有没有更好的词?不管怎样,原谅我的荷兰人;〜)
答案 5 :(得分:2)
Javascript中的变量没有类型。非零,非空,非空和true
为“true”。零,空,未定义,空字符串和false
为“false”。
虽然有文字true
和false
,但还有布尔类型。
答案 6 :(得分:2)
这样的事情怎么样:
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
我没有测试它的性能,但是从类型到类型的转换不应该经常发生,否则你打开你的应用程序会不稳定很长时间!
答案 7 :(得分:1)
变量将成为您分配的类型。最初是undefined
。如果你指定它'true'
它将成为一个字符串,如果你指定它true
它将成为一个布尔值,如果你指定它1
它将成为一个数字。后续分配可能会在以后更改变量的类型。