首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等效于类型转换语句中的多个表达式

等效于类型转换语句中的多个表达式
EN

Stack Overflow用户
提问于 2020-12-08 23:15:47
回答 2查看 3.5K关注 0票数 5

因为

代码语言:javascript
运行
复制
switch(1 === 1, 2 === 2) {
    case true, true:
        console.log("true, true");
        break;
    default:
        console.log("default");
        break;
}

不起作用(据我所知,只从逗号的右边),我想知道是否有类似铁锈匹配的打字本:

代码语言:javascript
运行
复制
match(1 == 1, 2 == 2) {
    (true, true) => println!("true, true"),
    _ => println!("default"),
}

我尝试过用元组来做一些事情,但是它总是处于默认的条件下,请参阅下面的代码。

代码语言:javascript
运行
复制
switch([1 === 1, 2 === 2]) {
    case [true, true]:
        console.log("true, true");
        break;
    default:
        console.log("default");
        break;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-08 23:33:24

使用JS开关语句是不可能的。在JS和TS中,switch语句的操作非常简单:

  • 计算开关中的表达式。
  • 把它(严格地)与每一种情况进行比较。

所以你看到的行为在一定程度上是由这两种行为引起的。首先要理解的是,使用逗号不起作用,因为它被解释为使用逗号运算符的表达式,正如您注意到的那样,这只是得到最后逗号表达式的值。

在第二次尝试中,它击中了默认表达式,因为在严格比较下,只有当两个对象是相同的引用时,它们才是相等的。因此,在您的开关中使用数组文字会产生一个新的数组对象(引用),它永远不会等于在每种情况下由文本创建的不同引用。

为了获得您想要的行为,您必须用传统的方法进行比较:手动使用if语句的集合。这将允许您单独比较元组中的每一项。也许是这样的:

代码语言:javascript
运行
复制
function compareTuples(tup1, tup2) {
  if (tup1.length !== tup2.length) return false;
  return tup1.every((value, index) => tup2[index] === value);
}

const base_tuple = [1 === 1, 2 === 2]

if (compareTuples(base_tuple, [true, true])) {
  console.log("Matched [true, true]")
} else if (compareTuples(base_tuple, [true, false])) {
  console.log("Matched [true, false]")
} else {
  console.log("Matched default")
}

票数 4
EN

Stack Overflow用户

发布于 2020-12-08 23:36:52

不知道这是不是你想要的,但也许你可以用这个来解决问题

代码语言:javascript
运行
复制
const tuple: [number, number] = [3, 3]

switch (tuple.join(",")) {
    case "3,3": 
      console.log('1');
      break;
    case "3,4":
      console.log('2');
      break;
    default: throw "invalid"
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65208340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档