仅使用var在JavaScript中声明一个布尔值

时间:2009-03-17 11:58:47

标签: javascript boolean

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

var IsLoggedIn;

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

8 个答案:

答案 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”。

虽然有文字truefalse,但还有布尔类型。

答案 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它将成为一个数字。后续分配可能会在以后更改变量的类型。