如果我像这样声明一个 JavaScript 布尔变量:
var IsLoggedIn;
然后用true
or初始化它1
,这样安全吗?或者将它初始化为1
使变量成为数字?
如果我像这样声明一个 JavaScript 布尔变量:
var IsLoggedIn;
然后用true
or初始化它1
,这样安全吗?或者将它初始化为1
使变量成为数字?
类型取决于您的初始化:
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 中的赋值。
不,这不安全。你可以稍后再做 varIsLoggedIn = "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
正如这个非常有用的教程所说:
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;
then 初始化它,它将被视为一个整数。
但是,在任何时候,变量IsLoggedIn
都可以引用不同的数据类型:
IsLoggedIn="Hello World";
这不会导致错误。
您至少可以使用和测试未初始化变量的“定义性”。像这样:
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);
给出一个参考 Error ('HelloWorld is not defined')
(“定义性”有更好的词吗?请原谅我的荷兰语;~)
Javascript 中的变量没有类型。非零、非空、非空且true
为“真”。零、空、未定义、空字符串并且false
是“假”。
但是有一个布尔类型,文字true
和false
.
像这样的东西怎么样:
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
,它将成为一个数字。随后的赋值可能会在以后更改变量的类型。