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

bes 22.11.2014 22:47

кстати, Илья забыл перевести одну важную строчку
http://es5.javascript.ru/x8.html#x8.9
Цитата:

8.9 Тип спецификации Completion # Ⓣ
Тип Completion Завершение используется для объяснения поведения инструкций (break, continue, return и throw), производящих нелокальную передачу управления. Значения типа Completion представляют собой триады в формате (тип, значение, цель), где тип – один из следующих: normal, break, continue, return или throw, значение – любое значение языка ECMAScript или empty, а цель – любой идентификатор ECMAScript или empty.

Термин "непредвиденное завершение" abrupt completion означает любое завершение с типом, отличным от normal.


http://www.ecma-international.org/pu...T/Ecma-262.pdf
Цитата:

8.9 The Completion Specification Type
The Completion type is used to explain the behaviour of statements (break, continue, return and throw)
that perform nonlocal transfers of control. Values of the Completion type are triples of the form (type, value,
target), where type is one of normal, break, continue, return, or throw, value is any ECMAScript language
value or empty, and target is any ECMAScript identifier or empty. If cv is a completion value then cv.type,
cv.value, and cv.target may be used to directly refer to its constituent values.


The term ―abrupt completion‖ refers to any completion with a type other than normal.

krutoy 22.11.2014 22:47

Цитата:

Сообщение от bes
и не сравнивать числовые и логические значения на равенство, ожидая, что когда-нибудь они будут строго равны

Он сравнивает логические и логические значения в данном случае, ты опять попутал.

bes 22.11.2014 22:53

Цитата:

Сообщение от krutoy
Он сравнивает логические и логические значения в данном случае, ты опять попутал.

скорее ты опять не вкуриваешь

если тебя успокоит, я писал об этом
Цитата:

Сообщение от psii
switch (width)
06
        {
07
            case (width > 1280)


krutoy 22.11.2014 22:56

bes,
если ты писал об "этом", нахрена ж ты цитировал совершенно другое, из того, где ТС уже разобрался.

krutoy 22.11.2014 22:58

Цитата:

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

Вот на это ты отвечал. И даже процитировал.

bes 22.11.2014 23:10

Цитата:

Сообщение от krutoy
bes,
если ты писал об "этом", нахрена ж ты цитировал совершенно другое, из того, где ТС уже разобрался.

Цитата:

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

если бы он написал "надо было" вместо "надо", то может быть ещё и подумал бы постить или не постить, а так выглядит так, как будто человеку дали нож и сказали "коли", он понял, что ножом только колют, а им (ножом) ещё как минимум резать можно :)
а в целом, всё ради того, чтобы ТС понял где в первую очередь нужно искать ответы на свои вопросы

Цитата:

Сообщение от krutoy (Сообщение 342439)
Вот на это ты отвечал. И даже процитировал.

формируй цитаты правильно, не bes это писал, bes только цитировал ;)


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