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


89

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

var IsLoggedIn;

然后使用true或初始化它1,这样安全吗?还是将1变量初始化为数字?


27
它确实取决于您所说的“安全”,JavaScript中没有“安全”。
AnthonyWJones

Answers:


164

类型取决于您的初始化:

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
如果我直接将布尔变量声明为布尔该怎么办。是任何性能上的改进
murtaza.webdev

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

6
不要使用new Boolean(); 在所有这些情况下,IsLoggedIn的计算结果都将为true(是,是,新的Boolean(false)为true)。
英里

@Miles:新的Boolean(false)为false否为true
2013年1

5
@jan:if (new Boolean(false)) alert ('wat')请参阅stackoverflow.com/a/8695363
Miles

@Miles难以置信,因为(new Boolean(false)).toString()) === "false",该链接的感谢

10

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

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

可能没有真正的解释。没有人愿意梳理您可以在帖子中的tl; dr中指定的教程
Heimi

7

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

var IsLoggedIn=true;

如果使用进行初始化,var IsLoggedIn=1;则它将被视为整数。

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

 IsLoggedIn="Hello World";

这不会导致错误。


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

提供参考错误(“ HelloWorld未定义”)

(“定义”这个词有更好的词吗?请原谅我的荷兰人;〜)


您可能希望使用空字符串重试字符串大小写thisMayBeTrue = '';-由于空字符串是虚假的,因此不会获得相同的结果。“PS:你不能考‘definedness’为不存在的,虽然变量” -当然,您可以:typeof HellowWorld === 'undefined'
nnnnnn

2

Javascript中的变量没有类型。非零,非空,非空且true为“ true”。零,空,未定义,空字符串和false为“ false”。

但是有一个布尔类型,字面量truefalse


JS 变量没有某种类型,因为您不能声明仅容纳整数或字符串的变量(就像其他一些语言一样),但是该变量在任何给定时间所拥有的特定将始终具有一种。类型很重要,可以通过2 + 2vs之类的简单示例来说明"2" + 2。另请参阅typeof运算符
nnnnnn 2012年

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

我尚未对其性能进行过测试,但是从类型到类型的转换不应经常发生,否则您将不得不长时间不稳定地打开应用程序!


2
为什么要投反对票?请说明,以便我们都能受益。
TruMan1 2015年

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.