Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.11.2014, 23:42
Новичок на форуме
Отправить личное сообщение для psii Посмотреть профиль Найти все сообщения от psii
 
Регистрация: 21.11.2014
Сообщений: 4

Помогите разобраться с оператором switch
Помогите разобраться с оператором switch.
В примере ниже, одинаковые конструкции на if и на switch.
if работает, а switch нет, всегда выполняется то что в default.
Что я не так делаю?

function adjustStyle(width)
    {
        width = parseInt(width);

        switch (width) 
        {
            case (width > 1280):
                $("#paragraph4").attr("style", "display = ''");
                break;
            default:
                $("#paragraph4").attr("style", "display: none");
        }
        /*
        if (width > 1280)
        {
            $("#paragraph4").attr("style", "display = ''");
        } 
        else 
        {
            $("#paragraph4").attr("style", "display: none");
        }
        */
    }

    $(function()
        {
            adjustStyle($(this).width());
            $(window).resize(function()
                {
                    adjustStyle($(this).width());
                }
            );
        }
    );
Ответить с цитированием
  #2 (permalink)  
Старый 21.11.2014, 23:54
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

switch(1<2){
case true: alert(true); break
default: alert(false)
}

То есть, в твоем случае
switch (width>1280)
        {
            case true:
                $("#paragraph4").attr("style", "display = ''");
                break;
            default:
                $("#paragraph4").attr("style", "display: none");
        }

Последний раз редактировалось krutoy, 21.11.2014 в 23:58.
Ответить с цитированием
  #3 (permalink)  
Старый 22.11.2014, 00:00
Новичок на форуме
Отправить личное сообщение для psii Посмотреть профиль Найти все сообщения от psii
 
Регистрация: 21.11.2014
Сообщений: 4

Это был пример, в реальном скрипте много кейсов:
case (width > 1280):
case (width > 1400):
case (width > 1600):
и т.д.

Я знаю что на С и в PHP, такой код работал бы без проблем,
а в javascript похоже какая-то засада.

Последний раз редактировалось psii, 22.11.2014 в 00:06.
Ответить с цитированием
  #4 (permalink)  
Старый 22.11.2014, 00:09
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Я просто пытался объяснить логику работы. Может так понятней, я хз
width="100"
switch(width){
case "99": alert(99); break
case "100": alert(100); break
case "101": alert(101); break
default: alert("smth else")
}
Ответить с цитированием
  #5 (permalink)  
Старый 22.11.2014, 00:14
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от psii
Это был пример, в реальном скрипте много кейсов:
case (width > 1280):
case (width > 1400):
case (width > 1600):
и т.д.
Почему бы тебе не использовать иф

Последний раз редактировалось krutoy, 22.11.2014 в 00:21.
Ответить с цитированием
  #6 (permalink)  
Старый 22.11.2014, 00:16
Новичок на форуме
Отправить личное сообщение для psii Посмотреть профиль Найти все сообщения от psii
 
Регистрация: 21.11.2014
Сообщений: 4

Если не разберусь со switch буду использовать if.
Просто интересно понять в чем дело.
Да и switch как-то кошернее, чем множественные if else.

Логика switch мне понятна, но скрипт не работает.
Вероятно здесь какой-то нюанс.
Вопрос остается открытым.

Последний раз редактировалось psii, 22.11.2014 в 00:19.
Ответить с цитированием
  #7 (permalink)  
Старый 22.11.2014, 00:30
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

psii,
во первых, с логикой не лады
width=1400
f=function(width){
  if (width > 1280) return alert(1)
  if (width > 1400) return alert(2)
  if (width > 1600) return alert(3)
}
f(width)

В данном случае, до второй ветви не дойдет надо как то
width=1400
f=function(width){
  if (width >= 1280&&width<1400) return alert(1)
  if (width >= 1400&&width<1600) return alert(2)
  if (width >= 1600)  alert(3)
}
f(width)

или
width=1400
f=function(width){
  if (width >= 1600) return alert(1)
  if (width >= 1400) return alert(2)
  if (width >= 1280)  alert(3)
}
f(width)


А что касается "кошерности", каждому инструменту -- свое место.

Последний раз редактировалось krutoy, 22.11.2014 в 00:37.
Ответить с цитированием
  #8 (permalink)  
Старый 22.11.2014, 00:47
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от psii
Да и switch как-то кошернее, чем множественные if else.
Вот так можно свичем:
width=100
switch(true){
case (width<100): alert(1); break
case (width===100): alert("right"); break
case (width>100): alert(3); break
default: alert("smth else")
}
Ответить с цитированием
  #9 (permalink)  
Старый 22.11.2014, 01:11
Новичок на форуме
Отправить личное сообщение для psii Посмотреть профиль Найти все сообщения от psii
 
Регистрация: 21.11.2014
Сообщений: 4

Да, дело было в этом, надо писать switch (true).
Спасибо.
Ответить с цитированием
  #10 (permalink)  
Старый 22.11.2014, 22:07
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

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

у switch только один подводный камень, который нужно запомнить - там строгое сравнение
всё остальное обычно быстро просекается

http://es5.javascript.ru/x12.html#x12.11
Цитата:
Если input равно clauseSelector согласно определению оператора ===, то
Присвоить searching значение false.
Если C имеет StatementList, то
Произвести вычисление StatementList для C, и пусть R будет результатом.
Если R – непредвиденное завершение, вернуть R.
Пусть V =R.value.


Повторить
Пусть C будет следующим CaseClause в A. Если такого CaseClause нет, вернуть (normal, V, empty).
Если C имеет StatementList, то
Произвести вычисление StatementList для C, и пусть R будет результатом.
Если R.value не равно empty, то пусть V =R.value.
Если R – непредвиденное завершение, то вернуть (R.type,V,R.target).
перевожу: если строго равны, то выполнять всё, что после двоеточия до встречи непредвиденного завершения в виде break (см. чуть выше по ссылке)
вернуть предполагает завершение выполнения шагов алгоритма
если посмотреть дальше (пункт Повторить), то видно, что все операторы во всех case-ах будут выполняться вне зависимости от того, равны ли они с результатом вычисления входного выражения, выполняться сам понимаешь до какого момента
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ответа сервера через iframe и xhr. Помогите разобраться. Arconas AJAX и COMET 0 26.02.2013 10:38
Помогите разобраться: false, null?? eirnvn Общие вопросы Javascript 12 12.11.2012 22:22
Помогите Разобраться в споре. merzavchick Оффтопик 48 03.10.2012 17:51
Помогите пожалуйста разобраться Kupu4 Ваши сайты и скрипты 0 21.01.2010 10:44
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24