94

如果我像这样声明一个 JavaScript 布尔变量:

var IsLoggedIn;

然后用trueor初始化它1,这样安全吗?或者将它初始化为1使变量成为数字?

4

8 回答 8

173

类型取决于您的初始化:

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 中的赋值。

于 2009-03-17T12:03:02.883 回答
20

不,这不安全。你可以稍后再做 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
于 2009-03-17T12:00:30.393 回答
10

正如这个非常有用的教程所说:

var age = 0;

// bad
var hasAge = new Boolean(age);

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;
于 2013-03-26T13:35:49.393 回答
7

如果您想IsLoggedIn被视为布尔值,则应按如下方式初始化:

var IsLoggedIn=true;

如果你用var IsLoggedIn=1;then 初始化它,它将被视为一个整数。

但是,在任何时候,变量IsLoggedIn都可以引用不同的数据类型:

 IsLoggedIn="Hello World";

这不会导致错误。

于 2009-03-17T12:01:57.317 回答
5

您至少可以使用和测试未初始化变量的“定义性”。像这样:

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')

(“定义性”有更好的词吗?请原谅我的荷兰语;~)

于 2009-03-17T13:06:31.453 回答
2

Javascript 中的变量没有类型。非零、非空、非空且true为“真”。零、空、未定义、空字符串并且false是“假”。

但是有一个布尔类型,文字truefalse.

于 2009-03-17T12:06:12.813 回答
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

我还没有测试过它的性能,但是从一个类型转换到另一个类型不应该经常发生,否则你打开你的应用程序很不稳定!

于 2012-06-20T15:23:36.377 回答
1

该变量将成为您分配给它的任何类型。最初是undefined. 如果您分配它'true',它将成为一个字符串,如果您分配它true,它将成为一个布尔值,如果您分配它1,它将成为一个数字。随后的赋值可能会在以后更改变量的类型。

于 2009-03-17T12:05:43.347 回答