Javascript.RU

switch

Сравнивает значение выражения с различными вариантами и при совпадении выполняет соответствующий код

Синтаксис

switch (expression) {
   case label1:
      statements1
      [break]
   case label2:
      statements2
      [break]
   ...
   case labelN:
      statementsN
      [break]
   default:
      statements_def
      [break]
}

Аргументы

expression
Выражение для сравнения
labelN
Значение, с которым сравнивать
statementsN
Ветка кода, на которую перейдет управление при совпадении expression с labelN
statements_def
Ветка кода, которая будет выполнена, если expression не совпадет ни с одним значением labelN

Описание, примеры

Конструкция switch служит для сравнения значения на равенство с различными вариантами.

При этом равенство подразумевается в смысле оператора "===", сравнивать с регулярным выражением или как-то еще switch не умеет.

Если совпадение найдено, то соответствующий код исполняется до оператора break, который прекращает выполнение switch и передает управление дальше.

Пример: обычное применение switch
var a = 2+2
switch (a) {
  case 3:
    alert('Маловато')
    break
  case 4:
    alert('В точку!')
    break
  case 5:
    alert('Перебор')
    break
  default:
    alert('Я таких значений не знаю')
}

Если оператор break отсутствует, то выполнение продолжается дальше.

Например, предыдущий пример без break:

Пример: switch без break
var a = 2+2
switch (a) {
  case 3:
    alert('Маловато')
  case 4:
    alert('В точку!')
  case 5:
    alert('Перебор')
  default:
    alert('Я таких значений не знаю')
}

При a=4 последовательно будут выполнены операторы:

alert('В точку!')

alert('Перебор')

alert('Я таких значений не знаю')

Несколько значений case можно группировать.

Пример: группировка case
var a = 2+2
switch (a) {
  case 4:
    alert('Верно!')
    break
  case 3:
  case 5:
    alert('Неверно!')
    break
  default:
    alert('Я таких значений не знаю')
}

Автор: Гость (не зарегистрирован), дата: 16 марта, 2010 - 06:24
#permalink

У меня не работает что-то. Причем по-моему уже второй раз пробую этот код отсюда.

<script type="text/javascript">
$(document).ready(function() {
$("#div").change(function(){
id = $('select#div').val();
switch (id) {
  case test:
    alert('test')
    break
  case megatest:
    alert('megatest')
    break
  default:
    alert('Я таких значений не знаю')
}
});
});
</script>

Автор: Гость (не зарегистрирован), дата: 5 мая, 2011 - 04:55
#permalink

в кавычки заключи значения, с которыми сравниваешь кейсами, вот так:
... case 'test': ...
... case 'megatest': ...
иначе у тебя test и megatest в кейсах воспринимаются как переменные и их содержимое не равно тому, что у тебя находится в id


Автор: Гость (не зарегистрирован), дата: 12 декабря, 2013 - 22:13
#permalink

обведи то, что идёт после case в кавычки.
например:

case 'test':
alert('test')
break
case 'megatest':
alert('megatest')
break
default:
alert('Я таких значений не знаю')


Автор: Гость (не зарегистрирован), дата: 17 марта, 2010 - 23:43
#permalink

Может стоит писать вместо
case test:
с кавычками?
case "test":


Автор: Гость (не зарегистрирован), дата: 18 октября, 2010 - 18:08
#permalink

Из статьи неясно, может ли применяться данный оператор для строковых данных.
В Си, Си++ данный оператор применим только для порядковых типов данных.
Всё же это язык "среднего уровня".
На языке же высокого уровня (пример PHP) данный оператор может применяться и для строковых данных.

Попробовал запустить в JS, ответ неоднозначен: с одной стороны ошибка не генерится, с другой, работает оператор непредсказуемо.


Автор: Гость (не зарегистрирован), дата: 27 апреля, 2011 - 15:10
#permalink

Всё же это язык "среднего уровня".

Аргументируем, не стесняемся!

Т.е JS - язык "среднего уровня", а PHP - язык "высокого уровня"? Я не хочу холиварить, оскорблять "язык для персональных страничек", но сам факт такого высказывания показывает, что автор не знает ни JS, ни PHP.

Тот факт, что JS менее "нагружен", чем сишки \ кресты \ жаба \ питон лишь указывает на более полную свободу в выборе решения, чем в вышеперечисленных.


Автор: Гость (не зарегистрирован), дата: 3 мая, 2011 - 10:42
#permalink

Да, не -- я думаю, что "язык среднего" уровня относился к C и C++
по сравнению с JS и PHP это можно считать справедливым.
Хотя на самом деле все указанные языки являются языками высокого уровня.

Языком среднего уровня условно можно считать байт-код Java и управляемый код .Net


Автор: Дмитрий11 (не зарегистрирован), дата: 21 декабря, 2010 - 19:13
#permalink

в FireFox:

var sc = 1;
switch (sc) {
case false:
alert('false');
break;

case true:
alert('true');
break;


default:
//попадаем сюда
if ( !isNaN(sc) )
   alert( sc.toString() );
}

похоже сравнение типов здесь c использованием оператора "===".
Во всех ли бразерах так?


Автор: Гость (не зарегистрирован), дата: 27 апреля, 2011 - 15:11
#permalink

Да, оператор идентичности.


Автор: most (не зарегистрирован), дата: 14 марта, 2011 - 17:53
#permalink

То же самое что и if(){}else if(){}else if(){}else{}


Автор: Гость (не зарегистрирован), дата: 3 мая, 2011 - 10:51
#permalink

Не совсем так. Switch можно считать заменной if () else if () ... только, если используется оператор break

И есть еще одно существенное отличие:
комбинация

case cond1:
case cond2:
     // some code here
break

будет работать, как:

if (cond1 || cond2) {
          // some code here
}

а не как:

if (cond1) {
       if (cond2) {
           // some code here
       }
}

Автор: Dimitryi83 (не зарегистрирован), дата: 30 августа, 2011 - 17:52
#permalink

А есть ли возможность поставить интервал?
Например Case 5 -10 (То есть, 5, 6, 7, 8, 9, 10. Дефис я поставил для примера, я понимаю что это математическая операция. А есть символы интервала?)


Автор: Гость (не зарегистрирован), дата: 7 сентября, 2011 - 16:15
#permalink

case x>5:
case x<10:
// some code here
break


Автор: Sweet, дата: 8 сентября, 2011 - 15:05
#permalink
var x = 7;
switch( true ){
  case x < 5:
  alert( "x < 5" );
  break;
  *!*case x > 5 && x < 10:*/!*
  alert( "5 < x < 10" );
  break;
  case x > 10:
  alert( "x > 10" );
  break;
};

Автор: Гость (не зарегистрирован), дата: 18 января, 2012 - 08:31
#permalink

Ваш код равнозначен:

if ( (x>5) || (x<10) ){
  // some code here
}

А значит код выполнится в любом случае! Даже при x = -100500


Автор: Гость (не зарегистрирован), дата: 3 октября, 2012 - 07:53
#permalink

А вот в таком примере:

case x>5:
case x<10:
// some code here
break

условия не надо брать в скобки?

case (x>5):
case (x<10):
// some code here
break


Автор: Chaotic Evil, lol (не зарегистрирован), дата: 10 января, 2012 - 22:35
#permalink

Я попросил бы добавить в статью пример того, как работать с интервалами (т.е. "%переменная% %/= (необходимое подчеркнуть, лол)% %число%").
Да, решение предложенное в комментариях, в принципе очевидно, но таки и до него нужно додуматься. Да, хорошо, что оно на страничке (пусть и в комментариях) есть.
Но таки в самой статье смотрелось бы дивно.


Автор: Вовик (не зарегистрирован), дата: 21 января, 2012 - 15:48
#permalink
var zapros = navigator.userAgent;
var shablon = /(chrome|firefox)/gi;
var q1 = zapros.match(shablon);
switch (q1) {
	case 'Chrome':
	document.write("Это Chrome")
	break

	case 'Firefox':
	document.write("Это Firefox")
	break

	default:
	document.write("Не получилось")
}

Ребята скажите, почему у меня не работает. Хочу проверить какой у пользователя браузер и вывести сообщение.
Я уже и так и эдак не могу найти ошибку, а может это вообще не будет работать.
(Только switch, if-else и другие регулярные выражения не предлагать)


Автор: Гость (не зарегистрирован), дата: 26 января, 2012 - 16:59
#permalink

Видимо потому что в q1 у вас массив, в нулевом элементе которого - ожидаемое


Автор: Вовик (не зарегистрирован), дата: 28 января, 2012 - 17:32
#permalink

аффигеть, спасибо!
.match() как бы много совпадений нашел и вернул массив.


Автор: Guardian, дата: 19 июня, 2014 - 00:52
#permalink

string.match() всегда возвращает массив.


Автор: Гость (не зарегистрирован), дата: 21 мая, 2012 - 21:49
#permalink

А мне вот интерсно сработает ли вот такой вот код:

var a = 1;
var b = 2;

switch (a) {

  case '3' : 
    alert('foo');
    break;

  case 'a' :
    var c = a;
    a=b;
    nameF(a,b,c,);
    break;
}
function nameF(arg1,arg2,arg3) {
  alert('a = '+arg1+'  b = '+arg2+'  c = '+arg3+'  ');
}

Автор: megabyte1024 (не зарегистрирован), дата: 2 июля, 2012 - 00:49
#permalink

А можно как в Delphi после слова case перечислять несколько значений?


Автор: Гость (не зарегистрирован), дата: 7 ноября, 2012 - 17:42
#permalink

А можно сделать что бы файл работал как в php типа file.html?id=id ?


Автор: кот Вася (не зарегистрирован), дата: 5 декабря, 2012 - 13:40
#permalink

а как сделать, чтобы при дефолтном варианте ничего не менялось (выполнялось все как до введения свитча).

а то я не указываю дефолт, у меня и для остальных значений выполняется код, что я описал для одного варианта


Автор: russeljo, дата: 9 декабря, 2012 - 16:34
#permalink

Возможно ли конструкции делать вложенными?

например

switch (a)
{ case 1:
       switch (b) {
           case 2: 
                 ........
         }
       ..........
  case 2: 
       .........         
}

Автор: russeljo, дата: 9 декабря, 2012 - 16:38
#permalink

Сам выяснил, что можно

var x = prompt('name');
switch (x) {
	case '1':
			switch (x) {
						case '1':
 					 document.write("x=1");
  							break;
						};
			
	case '2':
		document.write("\; case continued")
	default:
		x = 1;
}

Автор: jors (не зарегистрирован), дата: 26 июня, 2013 - 11:21
#permalink

А такой вариант прокатит?

switch (variable) {
   case 1,2,5:
         //code
         break;
   case 7,9,10:
         //code
         break;
}

Автор: Гость (не зарегистрирован), дата: 21 декабря, 2013 - 08:12
#permalink

В примере забыли поставить точки с запятыми после каждого break


Автор: Гость (не зарегистрирован), дата: 30 января, 2014 - 14:53
#permalink

"А такой вариант прокатит?"
Меня всегда удивлял этот вопрос. javaScript же компилируется в браузере. Почему бы не проверить свой кусок кода... А если не прокатит - ответа консоли иногда хватает, чтобы понять в чем дело.
Другое дело - задавать вопросы "почему не работает" и "почему результат некорректный". С эти консолька не всегда справляется.


Автор: Никита Драгуцану (не зарегистрирован), дата: 17 апреля, 2014 - 10:10
#permalink
var a = 'jpg';
var b = 'png';
$('#main').prepend('<select><option>'+a+'</option><option>'+b+'</option></select>');
$('button').click(check);
function check() {
var m = $('option').val();
switch(m){
case a : $('#main').prepend('jpg'); break;
case b : $('#main').prepend('png'); break;
default : $('#main').prepend('LOL');
}
}

Мучаюсь как могу, уже не знаю что делать, вначале строил это на if и else, потом решил сделать компактнее со switch. Чего я пытаюсь добиться? Выбрал JPG, нажал на кнопку и написалось JPG. Выбрал PNG, нажал на кнопку и написалось PNG. Начальное значение в теге select как вы видите JPG и его он выводит без проблем, но при нажатии кнопки с выбранным PNG он высвечивает LOL - т.е. то что находится в default. Желательно не тупо сказать "вот так", а объяснить почему именно "вот так".


Автор: Гость (не зарегистрирован), дата: 18 апреля, 2014 - 22:09
#permalink

Проблема в селекторе $('option') - он выбирает все option'ы на странице, а тебе нужен активный. Добавь к селектору фильтр :selected, а именно $('option:selected').


Автор: Гость (не зарегистрирован), дата: 3 июня, 2014 - 12:03
#permalink

function grant (obj)
{ var k=0;
for (var i=0; i<=5; i++)
if ((obj.elements[i]).checked)
{k++}
switch ((obj.elements[0]).checked)
{
case 0:
document.getElementById("rockImg").src="1.jpg"
break;
case 1:
document.getElementById("rockIm").src="2.jpg"
break;
case 2:
document.getElementById("rockI").src="3.jpg"
break;
case 3:
document.getElementById("rock").src="4.jpg"
break;
case 4:
document.getElementById("roc").src="5.jpg"
break;
case 5:
document.getElementById("ro").src="6.jpg"
break;
default:
document.write("Не получилось")
}
obj.res.value=k
}
//-->

Результаты тестирования

Укажите те тесты, которыми Вы выполнили успешно:

тест 1

тест 2

тест 3

тест 4

тест 5

тест 6

сумма баллов по результатам тестирования

Case не работает, кто-то может помочь?


Автор: Guardian, дата: 27 июня, 2014 - 18:20
#permalink

для уменьшения вышеизложенных вопросов.

"выполняемый блок кода" в

switch( switch_expression ) {
    case  case_expression:
        // выполняемый блок кода
}

сработает только, если (switch_expression) === (case_expression) вернет true.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
9 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum