2016-08-03 109 views
2

這與default as first option in switch statement?非常相似,但是關於JS而不是PHP。Javascript switch語句 - 默認第一次OK?

我有不同的包裝風格調用其他功能的輔助功能。包裝的功能至少需要一個,最多可以接受4個參數。我正在做的是通過這個最小代碼示例很好地描述,這在我的Chrome和FF版本中運行良好。

function testSwitch(definition) { 
    var term, minLength, boundaryStart, boundaryEnd; 
    switch (definition.length) { 
     default: 
    case 4: 
     boundaryEnd = definition[3]; 
    case 3: 
     boundaryStart = definition[2]; 
    case 2: 
     minLength = definition[1]; 
    case 1: 
     term = definition[0]; 
     break; 
    case 0: 
     console.log('fail') 
     return; 
    } 
    console.log(term, minLength, boundaryStart, boundaryEnd); 
} 

(在實際使用情況下,它們被傳遞給實際的函數而不是console.log)。因此,這個想法是通過案例,允許提供太多的參數(但忽略多餘的參數),但如果提供的定義爲空則失敗。

所以我從我的測試知道,這似乎在某些瀏覽器至少,我可以依靠跨比較新的瀏覽器(如iOS版/ Android設備,IE8 +,封邊等),該工作工作?我知道排除break語句是明確定義的行爲,並且使用的範圍相當廣泛,但我們並不確定首先使用默認情況並且是空的(例如,如果某些瀏覽器JS引擎會優化空默認情況,那麼這不會爲我工作,因爲例如,當調用大小爲5的數組時,它不起作用)。

+0

您的方案對我的作品在Firefox 48。我想,這應該對所有JS工作引擎,因爲我認爲任何JS引擎都不會優化掉默認情況,因爲這肯定會改變控制流。 – Xufox

回答

2

我從來沒有見過一個人之前使用這種方法。這很聰明。作爲一個側面說明,聰明的是一把雙刃劍;如果這是你以外的任何人都會觸及的代碼,我強烈建議在那裏發表評論,以明確你是否故意這樣做,或者有人會改變它(因爲它看起來是錯誤的),並在沒有意識到意圖的情況下打破它。

documentation indicatesdefault沒有成爲最後條款要求。

如果您發現瀏覽器中這是行不通的,你可以稍微因此修改它,避免default

function testSwitch(definition) { 
    var term, minLength, boundaryStart, boundaryEnd; 
    switch (definition.length > 4 ? 5 : definition.length) { 
    case 5: 
    case 4: 
     boundaryEnd = definition[3]; 
    case 3: 
     boundaryStart = definition[2]; 
    case 2: 
     minLength = definition[1]; 
    case 1: 
     term = definition[0]; 
     break; 
    case 0: 
     console.log('fail') 
     return; 
    } 
    console.log(term, minLength, boundaryStart, boundaryEnd); 
} 
+0

謝謝 - 我實際上一直在仔細研究那個確切的頁面,如果我看到「按照慣例,默認的子句是最後一個子句,但它並不需要如此。」引用那麼它會回答我的問題,但我每次都以某種方式掃描它。絕對同意,它會被評論,並附帶一個鏈接到這個答案。 –