Проблема с оператором переключения JavaScript - PullRequest
4 голосов
/ 16 августа 2010

elmid = "R125";

switch(true){

    case elmid.match(/R125/):
      idType = "reply";
    break;

}

alert(idType);  // Returns undefined

-------------------BUT----------------------

elmid = "R125";

if (elmid.match(/R125/)){idType = "reply";}

alert(idType);  // Returns "reply"


Использование swtich возвращает неопределенное значение, но использование if возвращает ожидаемое значение, что вызывает сбой переключения?Почему это так?что я тут не так делаю?Может ли кто-нибудь объяснить, почему я получаю разные результаты =).

ПРИМЕЧАНИЕ: Нет советов, чтобы использовать оператор if в этом случае, я знаю, что мой вопрос лаконичен для того, чтобы спрашивать там, следовательно, неттолько 1 случай в выражении switch.

Ответы [ 3 ]

10 голосов
/ 16 августа 2010
elmid.match(/R125/)

Возвращает фактические совпадения регулярных выражений, , а не true или false.

Когда вы пишете оператор if и используете ==, можно выполнить некоторое базовое преобразование типов, чтобы оно работало должным образом. Операторы Switch используют сравнение идентификаторов (===), поэтому это не сработает.

Если вы хотите сделать это таким образом, используйте вместо этого regex.test () (который возвращает логическое значение).

case /R125/.test(elmid):
0 голосов
/ 16 августа 2010

.match возвращает совпадения, соответствующие RegEx, а не только true или false.
В операторе switch тестовые значения сравниваются с использованием ===, а не ==.
Таким образом, полученное выражение ["R125"] === true неверно и case никогда не выполняется.

0 голосов
/ 16 августа 2010

Функция match возвращает массив или ноль, поэтому она никогда не вернет "true". Но вы передаете true в операторе switch, поэтому все, что вы можете проверить, это "true". Смотрите определение соответствия ()

Определение соответствия

Но если вы используете оператор if (с оператором == вместо оператора ===), найденный массив будет действительным как true в операторе if.

...