【问题标题】:Declaring a boolean in JavaScript using just var仅使用 var 在 JavaScript 中声明布尔值
【发布时间】:2010-10-13 19:50:05
【问题描述】:

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

var IsLoggedIn;

然后使用true1 对其进行初始化,这样安全吗?或者将使用1 初始化它使变量成为一个数字?

【问题讨论】:

  • 这确实取决于您所说的“安全”是什么意思,javascript 中没有“安全”。

标签: javascript boolean


【解决方案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 中的赋值。

【讨论】:

  • 如果我直接将布尔变量声明为布尔值会怎样。是否可以提高性能
【解决方案2】:

不,这不安全。您可以稍后执行 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

【讨论】:

  • 不要使用 new Boolean(); IsLoggedIn 在所有这些情况下都将评估为 true(是的,new Boolean(false) 为 true)。
  • @Miles: new Boolean(false) is false not true
  • @jan: if (new Boolean(false)) alert ('wat')stackoverflow.com/a/8695363
  • @Miles Incredible,(new Boolean(false)).toString()) === "false",感谢您的链接
【解决方案3】:

正如very useful tutorial 所说:

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

【讨论】:

  • 可能没有真正的解释。没有人想梳理一个你可以在 tl;dr 在你的帖子中指定的教程
【解决方案4】:

如果您希望 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 所说的“真实” '或我认为是'虚假')。在这种情况下,将 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 is not defined')

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

    【讨论】:

    • 您可能想用空字符串thisMayBeTrue = ''; 重试您的字符串案例 - 因为空字符串是虚假的,所以您不会得到相同的结果。 “PS:你不能测试不存在变量的‘定义性’” - 当然可以:typeof HellowWorld === 'undefined'.
    【解决方案6】:

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

    不过有一个布尔类型,文字 truefalse 也是如此。

    【讨论】:

    • JS variables 没有类型,因为你不能声明一个只能保存整数或字符串的变量(就像在其他一些语言中发生的那样),但是变量在任何给定时间持有的特定 value 将始终具有类型。类型很重要,可以用2 + 2"2" + 2 之类的简单示例来说明。另请参阅typeof operator
    【解决方案7】:

    这样的事情怎么样:

    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
    

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

    【讨论】:

    • 为什么投反对票?请解释一下,以便我们都能受益。
    【解决方案8】:

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

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 2011-12-12
      • 2012-04-29
      • 2014-08-22
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多