我打算使用类似于下面的实验函数(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 ,
}
}
答案 0 :(得分:2)
虽然我不确定,但原因似乎是开关不执行隐式强制。 Boolean()也可以被认为是显式的,因为它被编写为接受布尔值以外的值。再一次,我不确定,但一个快速的小提琴可能证实了这种怀疑。