Можно ли использовать .contains() в инструкции switch?

Это простой пример того, что я пытаюсь сделать:

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");
}

Ответ 1

"Да", но он не будет делать то, что вы ожидаете.

Выражение, используемое для коммутатора, оценивается один раз - в этом случае contains оценивает значение true/false как результат (например, switch(true) или switch(false)) , а не строку, которая может быть сопоставлена ​​в случае.

Таким образом, вышеупомянутый подход не будет работать. Если этот шаблон не намного больше/расширяем, просто используйте простые инструкции 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 (и, возможно, другие) предоставляют механизмы для обработки более "расширенного использования".