如果我这样声明JavaScript布尔变量:
var IsLoggedIn;
然后使用true
或初始化它1
,这样安全吗?还是将1
变量初始化为数字?
Answers:
类型取决于您的初始化:
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中分配的值。
不,这不安全。您稍后可以执行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
if (new Boolean(false)) alert ('wat')
请参阅stackoverflow.com/a/8695363
(new Boolean(false)).toString()) === "false"
,该链接的感谢
您至少可以使用和测试未初始化的变量来定义它们。像这样:
var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
此外,还有很多可能性:如果您对精确类型不感兴趣,请使用'=='运算符(或![variable] / !! [variable])进行比较(Douglas Crockford称之为'truthy'或'错(我认为)。在这种情况下,在被问到时,给统一变量分配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未定义”)
(“定义”这个词有更好的词吗?请原谅我的荷兰人;〜)
thisMayBeTrue = '';
-由于空字符串是虚假的,因此不会获得相同的结果。“PS:你不能考‘definedness’为不存在的,虽然变量” -当然,您可以:typeof HellowWorld === 'undefined'
。
Javascript中的变量没有类型。非零,非空,非空且true
为“ true”。零,空,未定义,空字符串和false
为“ false”。
但是有一个布尔类型,字面量true
和false
。
2 + 2
vs之类的简单示例来说明"2" + 2
。另请参阅typeof
运算符。
这样的事情怎么样:
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
我尚未对其性能进行过测试,但是从类型到类型的转换不应经常发生,否则您将不得不长时间不稳定地打开应用程序!