2017-08-29 29 views
1

我打算使用一個類似於下面的實驗函數(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 , 
    } 
} 
+0

爲什麼不使用switch(a == true),並且case true和case false? – neuhaus

+2

不要使用'switch(true)'。 '如果其他...'具有相同的功能和更好的可讀性。 – Bergi

+1

['switch'使用嚴格平等](https://stackoverflow.com/q/6989902/1048572)。 '布爾(a)'與'a'不一樣。 – Bergi

回答

2

雖然我不確定,原因似乎是開關不執行隱式強制。布爾()也可以被認爲是顯式的,因爲它被寫爲接受布爾值以外的值。再次,我不確定,但快速小提琴可能會證實懷疑。

+1

事實上是這樣的:你是對的。這就是爲什麼這種模式有時在所有的情況下被強制爲布爾值的情況下(用coffeescript編譯器表示)用'switch(false)'表示'!'的原因。 –