我打算使用一個類似於下面的實驗函數(testIfFalsy)中的開關語句,我寫這個語句來測試這樣的開關語句如何評估'真實性'或者我預計會拋出的某些數值的「虛假」。我知道這種開關語句「switch(true)」的形式有點不正常,但它不是非法使用開關,它非常適合代碼的可讀性和我期望使用的數據類型它與。我之前用BASIC的case語句成功完成了同樣的事情,現在我將相同的源代碼移植到Javascript中。js開關語句評估真/假的奇怪行爲
每個交換機的「case」子句中的註釋列出了該子句捕獲的值。我從這段代碼中得到了一些意外的結果。首先,當我寫這篇文章的時候,我從未期望看到由「默認」條款捕捉到的價值觀,因爲這意味着它們會滑過前面的兩個案例條款,因此被解釋爲既不真實也不虛假!但正如評論所顯示的那樣,確實有這樣的價值。
所有最奇怪的結果就是如何處理數字文字1。如果該變量的值爲數字1,則「if(a)」條件將該變量視爲true,如此代碼中的警報所述,「a爲真」,在switch語句之前執行。此外,交換機「default」子句中的第二個警報顯示「true」,表明語句「Boolean(a)」也將數值1視爲true。那麼爲什麼這個轉換語句將它視爲既不真實也不假?
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 ,
}
}
爲什麼不使用switch(a == true),並且case true和case false? – neuhaus
不要使用'switch(true)'。 '如果其他...'具有相同的功能和更好的可讀性。 – Bergi
['switch'使用嚴格平等](https://stackoverflow.com/q/6989902/1048572)。 '布爾(a)'與'a'不一樣。 – Bergi