JavaScript switch语句 - 默认情况放在最前面是否可行?

7
这与在switch语句中将default作为第一个选项的方法很相似,但是与PHP无关,而是涉及JS。
我有一个帮助函数,用于包装另一个函数的各种调用样式。被包装的函数至少需要一个参数,最多可以接受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的数组调用时,它就无法正常工作)。


您的场景在 Firefox 48 上可行。我猜它应该适用于所有 JS 引擎,因为我不认为任何 JS 引擎会优化掉“default”情况,因为这肯定会改变控制流。 - Sebastian Simon
个人而言,我会避免使用默认的default条件,因为我的感觉是,当其它情况都不符合时,它应该作为后备条件。这是其使用的传统理解,这样使用显然可以创造一致性和更容易理解。我建议,如果你发现自己首先使用default,那么可能有一个更清晰的方法来构建你的解决方案。 - Chris Halcrow
1个回答

6
我从未见过有人使用这种方法。它很聪明。顺便说一句,聪明是一把双刃剑;如果这段代码除了你之外的其他人也会接触到,我强烈建议在那里加上注释,以明确你是故意这样写的,否则有人会更改它(因为它“看起来不对”),而没有意识到其意图。 文档 指出 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);
} 

1
谢谢 - 实际上我一直在仔细阅读那个页面,如果我看到了“按照惯例,默认子句是最后一个子句,但不必如此。”这句话,那么它就可以回答我的问题,但是每次我都不知道为什么会忽略它。肯定会加上注释,并包含指向这个答案的链接。 - Chris O'Kelly
我认为默认情况下不会按照出现的顺序执行,它显然会无论如何最后执行。 - janat08

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接