这与default as first option in switch statement?非常相似,但是关于JS而不是PHP。
我有一个辅助函数,它包含另一个函数的各种调用样式。包装函数至少需要一个,最多可以接受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 +,Edge等)?我知道排除break语句是明确定义的行为并且相当广泛地使用,但是我不确定将默认情况放在第一位并且是空的(例如,如果某些浏览器JS引擎会优化空的默认情况,那么这并不是'#39 ; t为我工作,因为当使用大小为5的数组调用时,它将无法工作。
答案 0 :(得分:2)
我以前从没见过有人使用这种方法。它很聪明。作为旁注,巧妙的是一把双刃刀片;如果这是代码,除了你以外的任何人都会触及,我强烈建议在那里发表评论以明确表示你是故意这样做的,或者某人会改变它(因为它看起来错了')并打破它没有意识到意图。
documentation indicates default
不需要是最后一个条款。
如果您发现浏览器不起作用,您可以稍微修改它并避免使用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);
}