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

var IsLoggedIn;

然后用以下任一方法初始化它 true 或者 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中分配的值。

其他提示

没有它是不是安全。你可以做的后来变种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

由于这非常有用的教程表示:

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 所说的“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.

附:不过,您无法测试不存在变量的“定义性”。所以:

alert(!!HelloWorld);

给出参考错误('HelloWorld 未定义')

(有更好的词来形容“定义”吗?无论如何请原谅我的荷兰语;~)

在Javascript变量没有一个类型。非零,非空,非空和true是“真”。零,null,未定义,空字符串和false是 “假”。

有一个布尔类型不过,因为是文字truefalse

如何是这样的:

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它会成为一个数字。随后的分配可以改变的可变后的类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top