Chr*_*lly 5 javascript cross-browser switch-statement
这与默认为 switch 语句中的第一个选项非常相似?,但关于 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);
}
Run Code Online (Sandbox Code Playgroud)
(在实际用例中,它们被传递给实际函数而不是 console.log)。所以这个想法是通过案例,允许提供太多参数(但忽略额外的参数),但如果提供的定义为空则失败。
所以我从我的测试中知道这似乎至少在某些浏览器中工作,我可以依靠它在最近的浏览器(例如 iOS/Android 设备、IE8+、Edge 等)上工作吗?我知道排除 break 语句是定义明确的行为并且使用相当广泛,但是我不太确定是否首先使用默认情况并且为空(例如,如果某些浏览器 JS 引擎会优化空默认情况,那么这不会对我有用,因为它在使用大小为 5 的数组调用时不起作用,例如)。
我以前从未见过有人使用这种方法。这很聪明。顺便说一句,聪明是一把两刃的刀片;聪明是一把双刃剑。如果这是除您以外的任何人都会接触的代码,我强烈建议在那里发表评论,以明确您是故意这样做的,或者有人会更改它(因为它“看起来错误”)并在没有意识到意图的情况下破坏它。
文档表明这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);
}
Run Code Online (Sandbox Code Playgroud)