2010-12-16 57 views
9

我剛剛在別人的JavaScript代碼中遇到了布爾switch語句。它看起來有點像這樣:JavaScript中布爾轉換語句的用途是什麼?

switch (a || b) { 
    case true: 
    // do some stuff 
    break; 
    default: 
    // do other stuff 
    break; 
} 

我還沒有編程很長時間,但我從來沒有見過這樣的事情。這看起來很愚蠢,但我想給程序員一個懷疑的好處。有沒有上面的代碼和下面之間的功能差異:

if (a || b) { 
    // do some stuff 
} 
else { 
    // do other stuff 
} 

,如果有,是什麼呢?

回答

8

是的,有區別。以你的例子進去,

var a = 0, 
    b = 1; 

現在讓我們來看看switch聲明:

switch (a || b) { 

當運行此switch語句,表達式a || b進行評估。 ||是一個短路操作符,如果它是「truthy」,它將返回左操作數的值,否則它將返回右操作數的值。在這種情況下,將返回a = 0,因此將返回b1)。現在看case聲明:

case true: 

在評估case聲明,對任一值進行任何類型強制和假定嚴格的平等。在我們的示例中,這與編寫1 === true相同,因此case語句後面的代碼永遠不會運行。因此,讓我們一起來看看if聲明:

if (a || b) { 

對於if語句,條件表達式a || b評估,然後將結果轉換成布爾。在內部,這看起來像ToBoolean(a || b)。由於a || b的計算結果爲1,強制1的布爾值爲true,條件通過並且該塊執行。

更好相當於是:

if ((a || b) === true) { 
    // do some stuff 
} 
else { 
    // do other stuff 
} 

正如所指出的,在那裏有許多情況和類型可以變化的情況下,一個switch聲明可能是有用的。但是,這種情況很少見。

+0

哇,謝謝。這很有趣。 – thismax 2010-12-16 14:36:11

+0

@thismax:np,很高興我能幫忙:-) – 2010-12-16 14:38:47

1

安迪的評論後更新並回答 沒有什麼區別(在你的例子),但在你的例子中, if塊是更具可讀性和更有意義在這種情況下(在我看來)。

switch荷蘭國際集團的計算結果爲 boolean聲明似乎是錯誤的,只是因爲總會有僅出現兩種情況( truefalse),基於這個原因,我建議 if塊來代替。

switch更有意義,當你評估一個變量,可以有多個值:

switch(fruitType) { 
    case 'Apple': 
    // Apple Code 
    break; 
    case 'Orange': 
    // Orange Code 
    break; 
    // etc... 
    default: // other fruit 
    break; 
} 

希望幫助!

+2

有區別。 '||'是一個短路運算符,它不一定會返回一個布爾值。例如'0 || 1'將返回'1',並且case語句嚴格相等。 – 2010-12-16 14:07:53

+1

@安迪:好點,謝謝你澄清。 – 2010-12-16 14:30:05

2

要清楚這種情況下看起來辱罵,但由於JavaScript是不是強在原則上鍵入它是有價值的,你無法控制輸入:

switch (foo) 
{ 
    case true: 
     // whatever 
     break; 
    case false: 
     // whatever 
     break; 
    default: 
     // FOO IS NOT A BOOLEAN, DO SOMETHING ELSE! 
     break; 
} 

除了安德魯的混合情況。這比簡單的if/else更安全,比某種布爾檢查更簡潔,然後是if/else。

+0

聰明!我喜歡。 – thismax 2010-12-16 13:58:07

+0

因爲安迪E更強有力地表明瞭案件的缺乏威脅。 – annakata 2010-12-16 15:18:10

0

在你的例子中,沒有區別。但根據ab如何定義,你可以添加更多的switch語句後面,f.ex:

var a = false, b = null; 
switch (a || b) { 
    case true: 
    // do some stuff 
    break; 
    case null: 
    // do some stuff 
    break; 
    default: 
    // do other stuff 
    break; 
} 

除此之外,它主要是編碼偏好的問題。

0

您的示例沒有顯示它,但我認爲如果您想在第一個case中使用fallthrough(即不中斷),這可能會使代碼更加簡潔,具體取決於具體情況。

它也可能是一個體面的結構,如果你正在實施某種方式來預測潛在的變化並希望儘可能減少返工(例如,在重做選擇邏輯時要保持相同的動作)。