2013-09-25 17 views
0

我通過JSHint運行我的代碼,我打這個錯誤:這個'開關'應該是'如果' - 爲什麼?

This switch should be an if

在這個代碼塊:

switch(true) 
{ 
    case Major === 0 && Minor === 0 && Patch < 433: 
     upgraded = upgraded.replace(/(\s+)skill(\d)=/gm, '$1section_8_$2_body='); 
    /* falls through */ 
    case Major === 0 && Minor === 0 && Patch < 442: 
     upgraded = upgraded.replace(/test=/gm, 'void='); 
    /* falls through */ 
    case Major === 0 && Minor === 0 && Patch < 459: 
     upgraded = upgraded.replace(/another=/gm, 'void='); 
    /* falls through */ 
} 

從谷歌上搜索,我發現this Github issue,但它看起來像那是因爲只有1 case

我該如何解決這個問題?我認爲沒有理由這switch應該是if。我正在使用的事實switch(true)與它有什麼關係?另外:在線版本(我使用記事本+ +插件)的代碼lints罰款。

+4

我同意JSHint。那'switch'看起來不太好... – elclanrs

+0

@elclanrs你會如何改寫它?我有點同意......當有很多升級途徑時,這可能會變成一個巨獸。 –

+0

那麼,'Patch'(爲什麼要領頭?)似乎是那裏唯一的變數。您可以使用'if,elseif'或找到一種模式將其抽象爲字典查找。如果沒有看到代碼的其他部分,不能確定地告訴你。 – elclanrs

回答

-1

switch語句意味着要測試的可能值的有限的已知列表中的單個變量或表達式(一個枚舉

var userColor = 'red'; 

switch(userColor){ 
    case 'red': 
     alert('Stop'); 
     break; 
    case 'yellow': 
     alert('Slow'); 
     break; 
    case 'green': 
     alert('Go'); 
     break; 
} 

即代碼基本上是一個快捷方式:

if(userColor == 'red'){ 
    alert('Stop'); 
}else if(userColor == 'yellow'){ 
    alert('Slow'); 
}else if(userColor == 'green'){ 
    alert('Go') 
} 

在您提供的代碼中,唯一的決定性因素是Patch的值,因爲其餘變量始終爲0.

我建議重構您的代碼以一系列if/else語句

if(Patch < 433){ 
    //... 
}else if(Patch < 442){ 
    //... 
}else if(Patch < 459){ 
    //... 
}else{ 
    //... fall through 
} 
+0

其他變量*不是*總是0.實際上,這個'switch'目前有大約50個'case'。此外,你的底部代碼塊可以很容易地改寫爲'switch(Patch){case 433:... case 442:... case 459:...}' –

+0

我們只能根據提供的信息提供幫助。如果還有更多需要了解編輯您的問題並提供詳細信息 – providencemac

+0

您可以閱讀關於該問題的評論以獲取更多信息。 –

1

我會做一些這樣的:

if(Major === 0 && Minor === 0){ 
    if(Patch < 433) { 
     upgraded = upgraded.replace(/(\s+)skill(\d)=/gm, '$1section_8_$2_body='); 
    } 
    if(Patch < 442) { 
     upgraded = upgraded.replace(/test=/gm, 'void='); 
    } 
    if(Patch < 459) { 
     upgraded = upgraded.replace(/another=/gm, 'void='); 
    } 
} 

它使語句機,是一個比較容易IMO閱讀。如果您對某個值進行直接平等,則開關將非常有用,但<會消除開關語句的所有「優點」。

+0

與此不同的是,在問題中,如果交換機在任何情況下都評估爲真,它仍會執行以下操作。在你的解決方案中,它只有一個。 例如,如果Patch <433,交換機將更改三次升級,在您的解決方案中,它只會更改一次。 – dajavax

+3

@dajavax我不認爲是這種情況(原諒雙關語)。你能告訴我你的想法背後的推理嗎?如果'Patch' <433,它也<442和459,那麼pllee的代碼也會改變'升級'三次,不是嗎? –

+0

交換機繼續執行下列情況,即使它們不是真實的,除非在案例開始前添加中斷。編輯:沒關係,我沒有做數學。 – dajavax

相關問題