【发布时间】:2010-10-13 19:50:05
【问题描述】:
如果我像这样声明一个 JavaScript 布尔变量:
var IsLoggedIn;
然后使用true 或1 对其进行初始化,这样安全吗?或者将使用1 初始化它使变量成为一个数字?
【问题讨论】:
-
这确实取决于您所说的“安全”是什么意思,javascript 中没有“安全”。
标签: javascript boolean
如果我像这样声明一个 JavaScript 布尔变量:
var IsLoggedIn;
然后使用true 或1 对其进行初始化,这样安全吗?或者将使用1 初始化它使变量成为一个数字?
【问题讨论】:
标签: javascript boolean
类型取决于您的初始化:
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",感谢您的链接
正如very useful tutorial 所说:
var age = 0;
// bad
var hasAge = new Boolean(age);
// good
var hasAge = Boolean(age);
// good
var hasAge = !!age;
【讨论】:
如果您希望 IsLoggedIn 被视为布尔值,您应该按如下方式初始化:
var IsLoggedIn=true;
如果你用var IsLoggedIn=1;初始化它,那么它将被视为一个整数。
但是,变量IsLoggedIn 可以随时引用不同的数据类型:
IsLoggedIn="Hello World";
这不会导致错误。
【讨论】:
您可以使用和测试未初始化的变量,至少它们的“定义性”。 像这样:
var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
此外,还有很多可能性:如果您对确切类型不感兴趣,请使用“==”运算符(或 ![variable] / !![variable])进行比较(这就是 Douglas Crockford 所说的“真实” '或我认为是'虚假')。在这种情况下,将 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 is not defined')
(“定义性”有更好的词吗?请原谅我的荷兰语;~)
【讨论】:
thisMayBeTrue = ''; 重试您的字符串案例 - 因为空字符串是虚假的,所以您不会得到相同的结果。 “PS:你不能测试不存在变量的‘定义性’” - 当然可以:typeof HellowWorld === 'undefined'.
Javascript 中的变量没有类型。非零、非空、非空和true 是“真”。零、null、未定义、空字符串和false 为“假”。
不过有一个布尔类型,文字 true 和 false 也是如此。
【讨论】:
2 + 2 与"2" + 2 之类的简单示例来说明。另请参阅typeof operator。
这样的事情怎么样:
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
我还没有测试过它的性能,但是从一个类型转换到另一个类型不应该太频繁,否则你打开你的应用程序很不稳定!
【讨论】:
变量将成为您分配给它的任何类型。最初是undefined。如果你给它分配'true',它会变成一个字符串,如果你给它分配true,它就会变成一个布尔值,如果你给它分配1,它就会变成一个数字。后续的赋值可能会在以后改变变量的类型。
【讨论】: