【问题标题】:Does JavaScript have an expression form of switch?JavaScript 有 switch 的表达形式吗?
【发布时间】:2016-08-09 14:06:14
【问题描述】:

当有条件地获取值时,我喜欢使用三元运算符(?:),这样我就可以拥有const 变量声明:

// Better
const foo = x ? 'bar' : 'goo';

// Worse
var foo;
if (x) {
    foo = 'bar';
} else {
    foo = 'goo';
}

我想对switch 语句做同样的事情。我可以使用一系列嵌套的?:,但是这样比较麻烦并且不能很好地扩展:

const foo = x === 1 ? 'bar' : (x === 2 ? 'goo' : 'zoo');

我什至可以使用闭包,但这也很冗长:

const foo = (() => {
  switch(x) {
    case 1: 
        return 'bar';
    case 2: 
        return 'goo';
    default:
        return 'zoo';
  }
})();

JavaScript 中有 switch 表达式 吗?

【问题讨论】:

  • OP 表示一个表达式
  • 如果你问 JavaScript 是否有用于开关的东西,同样的 if 语句有三元运算符,我认为任何语言都没有。
  • @DrewKennedy 我也没看到
  • 如果您试图将两个或三个以上的条件和值塞进同一行……您最好使用实际的switch 来编写干净、可读的代码我>。能够将所有内容压缩到一行中并没有固有的优势。
  • 有一个适合此用例的“do 表达式”提案。不幸的是,它是still at stage 0,尽管它受到 Babel 的支持。

标签: javascript switch-statement ternary-operator


【解决方案1】:

您首先应该保持内容的可读性和可管理性。将具有四个或五个值的两个或三个条件压缩到一行中几乎是不可读的。

我建议采用这种非常声明性的方法:

let fooToBarMap = {
    foo: 'bar',
    baz: 42
};

let y = fooToBarMap[x] || 'default';

【讨论】:

  • 需要注意的是,如果任何值是错误的,这将不起作用。但是,如果它们是常数,或者您知道它们总是真实的,这不是问题。
  • 请注意,使用对象文字您也可以匹配原型属性,它仅适用于Strings。而是使用Map
  • 所有有效的问题,但我认为这些确实是边缘情况,如果你遇到其中之一,很容易缓解。
  • 也可以单行:const result = { foo: 'bar', baz: 42 }[input] || 'default'。不保证可读性。
  • @gcampbell 你听我说什么了吗!? ;-)
【解决方案2】:

TL;DR: 没有这样的表达方式

三元是可能的

在这种情况下,您使用三元的方法是正确的方法。但正如你所见,它确实不能很好地扩展。

但使用函数似乎更好

解决方法是使用返回值的函数。

  function getSomething(input)
  {
     if(input == 1)
         // return for case 1
     if(input == 2)
         // return for case 2
      ...
  }

【讨论】:

  • @LUH3417 没问题 :-)
  • 这很有趣:if/else 与函数结合的语句与 switch 语句一样具有表达性,但由于函数范围/块范围,它们并不等效。
【解决方案3】:

没有。逻辑上等价的表达式可以是嵌套的三元运算符,如您所列出的,或者是类似笨拙的布尔操作数构造。

【讨论】:

  • @JordiCastilla - 请重新阅读问题并更谨慎地使用问号。 :)
【解决方案4】:

当它不太长时,我喜欢使用||&& 来达到这个目的。

const foo = (x === 1 && 'bar') || (x === 2 && 'goo') || 'zoo'

【讨论】:

  • 这不是 switch 的等价物,而是if/else 语句的等价物
  • @LUH3417 什么是开关? :)
  • 那个答案并没有改变事实,实际上它只是使我的陈述更加合法
  • x 是一个函数并且您想将其返回值传递给您的表达式时,如果没有 1) 多次应用 x() 和 2) 不要使用额外的变量?
猜你喜欢
  • 2023-01-22
  • 2020-07-14
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2012-12-16
  • 2011-10-10
相关资源
最近更新 更多