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

mrb*_*lah 88 javascript boolean

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

var IsLoggedIn;
Run Code Online (Sandbox Code Playgroud)

然后用或者初始化true或者1,是安全的呢?或者将1变量初始化为变量?

Can*_*var 160

类型取决于您的初始化:

var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool
Run Code Online (Sandbox Code Playgroud)

但是看看这个例子:

var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean
Run Code Online (Sandbox Code Playgroud)

变量的类型取决于JavaScript中的赋值.


Óla*_*age 19

不,这不安全.您以后可以执行var IsLoggedIn = "Foo";,JavaScript不会抛出错误.

有可能做到

var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);
Run Code Online (Sandbox Code Playgroud)

您也可以将非布尔变量传递给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
Run Code Online (Sandbox Code Playgroud)

  • 解决布尔值的更快捷方法是!! ......所以它会是!!"Foo"...... (6认同)
  • 不要使用new Boolean(); 在所有这些情况下,IsLoggedIn将评估为true(是的,new Boolean(false)为true). (6认同)
  • @jan:`if(new Boolean(false))alert('wat')`参见http://stackoverflow.com/a/8695363 (5认同)

小智 10

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

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;
Run Code Online (Sandbox Code Playgroud)


zpe*_*esk 7

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

var IsLoggedIn=true;
Run Code Online (Sandbox Code Playgroud)

如果用var IsLoggedIn=1;它初始化它将被视为整数.

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

 IsLoggedIn="Hello World";
Run Code Online (Sandbox Code Playgroud)

这不会导致错误.


Koo*_*Inc 5

可以至少为其"定义"使用和测试未初始化的变量.像这样:

var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
Run Code Online (Sandbox Code Playgroud)

此外,还有许多可能性:如果你对确切的类型不感兴趣,可以使用'=='运算符(或![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.
Run Code Online (Sandbox Code Playgroud)

PS:你不能测试不存在的变量的'定义'.所以:

alert(!!HelloWorld);
Run Code Online (Sandbox Code Playgroud)

给出引用错误('HelloWorld未定义')

(对于'定义'有没有更好的词?不管怎样,请原谅我的荷兰人;〜)