【问题标题】:Javascript switch statement - default first OK?Javascript switch 语句 - 默认先行好吗?
【发布时间】:2016-12-08 12:14:56
【问题描述】:

这与 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 的数组时不起作用,例如)。

【问题讨论】:

  • 您的方案适用于 Firefox 48。我想,它应该适用于所有 JS 引擎,因为我认为任何 JS 引擎都不会优化 default 案例,因为那肯定会改变控制流。

标签: javascript cross-browser switch-statement


【解决方案1】:

我以前从未见过有人使用这种方法。这很聪明。顺便说一句,聪明是一把双刃剑。如果这是除您以外的任何人都会接触的代码,我强烈建议您在此处发表评论,以明确您是故意这样做的,或者有人会更改它(因为它“看起来错误”)并在没有意识到意图的情况下破坏它.

default 不需要是最后一个子句的documentation 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);
} 

【讨论】:

  • 谢谢 - 我实际上一直在仔细研究那个确切的页面,如果我看到“按照惯例,默认子句是最后一个子句,但它不需要这样。”引用然后它会回答我的问题,但我每次都以某种方式扫描过去。绝对同意它会被评论,包括这个答案的链接。
  • 我不认为默认会按照它出现的顺序执行,它显然无论如何都会最后执行。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多