Javascript switch 语句 - 默认第一个可以吗?

Javascript switch statement - default first OK?

这与 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 引擎会优化空的默认情况,那么这不会对我有用,因为当使用大小为 5 的数组调用时它不起作用,例如)。

我以前从未见过有人使用过这种方法。这很聪明。作为旁注,聪明是 two-edged blade;如果这是除了你以外的任何人都会接触到的代码,我强烈建议在那里发表评论,以明确你是故意这样做的,否则有人会改变它(因为它 'looks wrong')并在没有意识到的情况下破坏它意图。

defaultdocumentation indicates不需要是最后一个子句

如果您发现某个浏览器无法正常工作,您可以稍微修改一下,避免 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);
}