Javascript switch 语句 - 默认先行好吗?

问题描述 投票:0回答:2

这与 default 作为 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);
}

(在实际用例中,它们被传递到实际函数而不是 console.log)。因此,我们的想法是通过案例,允许提供太多参数(但忽略额外的参数),但如果提供的定义为空,则会失败。

因此,从我的测试中我知道这似乎至少在某些浏览器中有效,我可以依赖它在相当新的浏览器(例如 iOS/Android 设备、IE8+、Edge 等)中工作吗?我知道排除break语句是明确定义的行为并且使用相当广泛,但我不太确定是否首先使用默认情况并为空(例如,如果某些浏览器JS引擎会优化空默认情况,那么这不会对我有用,因为例如,当使用大小为 5 的数组调用时它不起作用)。

javascript cross-browser switch-statement
2个回答
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);
} 

0
投票

玩玩时,我也只是想知道,我是否可以将默认值放在第一位或早点使用它,因此发现了这个问题。

问题和答案很旧,但人们仍然可以阅读它,问题是,在这两种情况下,前提都是完全错误的。

就我而言,我会创建类似的东西:

switch (checkMethod) {
case 'second':
  doSomething();
  break;
default:
case 'first':
  doSomethingElse();
  break;
}

这不是顺序、语言和 switch case 的问题,而是思想错误。没过多久我就意识到,我可以轻松地将其变成:

switch (checkMethod) {
case 'first':
  doSomethingElse();
  break;
case 'second':
default:
  doSomething();
}

我稍后再回到问题中的例子。但答案也有一个可怕的错误。

因为

definition.length > 4 ? 5 : definition.length
如果definition.length大于4,

将导致返回数字5,从而切换检查数字5的内容而不是变量definition.length。这可能或应该导致我的书中出现错误(虽然很容易测试,但实际上并未测试,因为无论如何编程都很糟糕)。

现在回到问题和问题中的例子。使用 switch case 的整个想法在示例中没有任何意义。

因为这个例子真正的作用是:

function testSwitch(defintion) {
  if (definition.length == 0) {
    console.log('fail');
    return;
  }
  console.log(definition[0], definition[1], definition[2], definition[3]);
}

鉴于这是我们拥有的唯一示例,我们只能对此做出回应,因此无法帮助提供适当的解决方案。但即使真实的代码不同,它也可能以某种方式进行优化。例如,即使案例中有不同的功能并且每个案例都有中断,前提仍然是错误的并且可以以这种或类似的方式进行优化。例如,通过在 if 中使用 OR 语句来表示 0 和大于 4 的情况。顺便说一句,为了正确的错误处理,无论如何都应该这样做。

请注意以下事实:虽然在函数内创建变量可能会使代码更易于理解或在函数内服务于其他目的,但它还需要保留内存并创建额外的进程,这些进程需要时间并影响性能。因此,在这个小例子中,这可能并不重要。但在其他情况下,这会影响 RAM 使用和应用程序的性能。

© www.soinside.com 2019 - 2024. All rights reserved.