js switch语句评估true / false的奇怪行为

时间:2017-08-29 11:14:53

标签: javascript switch-statement

我打算使用类似于下面的实验函数(testIfFalsy)中的switch语句,我写这篇语句来测试这样的switch语句如何评估某些数值的'真实性'或'虚假'期待投掷它。我知道这种形式的switch语句“switch(true)”有些不正统,但它不是非法使用switch,并且非常需要代码的可读性和我期望使用的数据类型它与。我之前使用BASIC的case语句做了相同的事情,并且我现在将相同的源代码移植到Javascript。

每个交换机的“case”子句中的注释列出了该子句捕获的值。我从这段代码得到了一些意想不到的结果首先,当我编写它时,我从未期望看到“默认”子句捕获的值,因为这意味着它们会超过前两个案例条款,因此被解释为既不是真也不是假!但正如评论所显示的那样,确实有这样的价值观。

最奇怪的结果是如何处理数字文字1​​。 “if(a)”条件在其值为数字1时将变量a视为true,如此代码中所示,警告说“a is true”,在switch语句之前执行。此外,交换机“default”子句中的第二个警告显示“true”,表示语句“Boolean(a)”也将数值1视为true。那么为什么这个switch语句将它视为既不是真也不是假?

function myCallingFunction() {
   var R;
   // unrelated code ...
   // Tail end of calling function
   R = testIfFalsy(0);
}

function testIfFalsy(a) {
   if (a) {alert ("a is true");}
   switch (true) {
   case (!a):
            alert ("it's true that a is false, a=" + a);
     // when arg is: NaN, undefined, null, 0, -0, 0/0, false,   !1 , '', R
     // value shown= NaN, undefined, null, 0,  0, NaN, false, false,   , undefined
        break;
   case  (a):
            alert ("it's true that a is true. a=" + a);
     // when arg is: true, !0,
     // value shown= true, true,
        break;
   default:
            alert ("a is neither true nor false, a=" + a);
            alert (Boolean(a));
     // when arg is: 1,2,-1,-2, 'cat', 'NaN', [0], 
     // value shown= 1,2,-1,-2,  cat ,  NaN ,  0 ,
   }
}

1 个答案:

答案 0 :(得分:2)

虽然我不确定,但原因似乎是开关不执行隐式强制。 Boolean()也可以被认为是显式的,因为它被编写为接受布尔值以外的值。再一次,我不确定,但一个快速的小提琴可能证实了这种怀疑。