Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Помогите разобраться с оператором switch (https://javascript.ru/forum/css-html/51851-pomogite-razobratsya-s-operatorom-switch.html)

psii 21.11.2014 23:42

Помогите разобраться с оператором 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());
                }
            );
        }
    );

krutoy 21.11.2014 23:54

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

psii 22.11.2014 00:00

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

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

krutoy 22.11.2014 00:09

Я просто пытался объяснить логику работы. Может так понятней, я хз
width="100"
switch(width){
case "99": alert(99); break
case "100": alert(100); break
case "101": alert(101); break
default: alert("smth else")
}

krutoy 22.11.2014 00:14

Цитата:

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

Почему бы тебе не использовать иф

psii 22.11.2014 00:16

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

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

krutoy 22.11.2014 00:30

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:47

Цитата:

Сообщение от 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")
}

psii 22.11.2014 01:11

Да, дело было в этом, надо писать switch (true).
Спасибо.

bes 22.11.2014 22:07

Цитата:

Сообщение от 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-ах будут выполняться вне зависимости от того, равны ли они с результатом вычисления входного выражения, выполняться сам понимаешь до какого момента


Часовой пояс GMT +3, время: 07:32.