在switch语句中可以使用.contains()吗?

51

这只是我试图做的一个简单示例:

switch (window.location.href.contains('')) {
    case "google":
        searchWithGoogle();
        break;
    case "yahoo":
        searchWithYahoo();
        break;
    default:
        console.log("no search engine found");
}

如果不可行,有什么更好的替代方案?

解决方案:

阅读一些回复后,我发现以下是一个简单的解决方案。

function winLocation(term) {
    return window.location.href.contains(term);
}
switch (true) {
    case winLocation("google"):
        searchWithGoogle();
        break;
    case winLocation("yahoo"):
        searchWithYahoo();
        break;
    default:
        console.log("no search engine found");
}

你尝试过使用正则表达式吗? - Walid Ammar
不行。这将是 switch(true) { case location.href.contains("google") ...,这很愚蠢。 - mplungjan
是的,但它不会做你期望的事情。用于 switch 的表达式只被评估一次 - 在这种情况下,结果将是 true/false,而不是字符串。 - user2864740
你需要使用 contains('Google'),而不是在 switch 中使用 no。请使用 if else。 - Esben Skov Pedersen
2个回答

38
"Yes",但它不会按照您期望的执行。
在这种情况下,用于开关的表达式只被评估了一次 - contains 作为结果评估为 true/false(例如 switch(true)switch(false)),而不是可以在一个 case 中匹配的字符串。
因此,上面的方法行不通。除非模式非常大/可扩展,否则请使用简单的 if/else-if 语句。
var loc = ..
if (loc.contains("google")) {
  ..
} else if (loc.contains("yahoo")) {
  ..
} else {
  ..
}

然而,考虑一下是否有一个classify函数返回"google"或"yahoo"等,可能使用类似上面的条件语句。那么它可以像这样使用,但在这种情况下很可能是过度设计。

switch (classify(loc)) {
   case "google": ..
   case "yahoo": ..
   ..
}

虽然以上讨论了JavaScript中的内容,但是Ruby和Scala(以及可能还有其他语言)提供了处理一些更复杂的“高级switch”用法的机制。


1
谢谢你的回答。它帮助我找到了解决方案,我已更新主要答案包含。 - RayB
@Rayz321 是的,那也是一种可能的形式 - 但那不是我的首选/推荐。 - user2864740
3
在JavaScript中,"Contains" 不是一个方法,应该使用 "include",例如: loc.includes("yahoo"),意思是判断字符串 loc 中是否包含 "yahoo"。 - Rahul Tagore

22

另一种实现可能是这样的。与 switch(true) 相比没有太大差别,但读起来更流畅。

const href = window.location.href;
const findTerm = (term) => {
  if (href.includes(term)){
    return href;
  }
};

switch (href) {
  case findTerm('google'):
      searchWithGoogle();
      break;
  case findTerm('yahoo'):
      searchWithYahoo();
      break;
  default:
      console.log('No search engine found');
};

至少它在答案部分 =) - ilkerkaran

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