21.11.2014, 23:42
|
Новичок на форуме
|
|
Регистрация: 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());
}
);
}
);
|
|
21.11.2014, 23:54
|
Профессор
|
|
Регистрация: 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.
|
|
22.11.2014, 00:00
|
Новичок на форуме
|
|
Регистрация: 21.11.2014
Сообщений: 4
|
|
Это был пример, в реальном скрипте много кейсов:
case (width > 1280):
case (width > 1400):
case (width > 1600):
и т.д.
Я знаю что на С и в PHP, такой код работал бы без проблем,
а в javascript похоже какая-то засада.
Последний раз редактировалось psii, 22.11.2014 в 00:06.
|
|
22.11.2014, 00:09
|
Профессор
|
|
Регистрация: 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")
}
|
|
22.11.2014, 00:14
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от psii
|
Это был пример, в реальном скрипте много кейсов:
case (width > 1280):
case (width > 1400):
case (width > 1600):
и т.д.
|
Почему бы тебе не использовать иф
Последний раз редактировалось krutoy, 22.11.2014 в 00:21.
|
|
22.11.2014, 00:16
|
Новичок на форуме
|
|
Регистрация: 21.11.2014
Сообщений: 4
|
|
Если не разберусь со switch буду использовать if.
Просто интересно понять в чем дело.
Да и switch как-то кошернее, чем множественные if else.
Логика switch мне понятна, но скрипт не работает.
Вероятно здесь какой-то нюанс.
Вопрос остается открытым.
Последний раз редактировалось psii, 22.11.2014 в 00:19.
|
|
22.11.2014, 00:30
|
Профессор
|
|
Регистрация: 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.
|
|
22.11.2014, 00:47
|
Профессор
|
|
Регистрация: 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")
}
|
|
22.11.2014, 01:11
|
Новичок на форуме
|
|
Регистрация: 21.11.2014
Сообщений: 4
|
|
Да, дело было в этом, надо писать switch (true).
Спасибо.
|
|
22.11.2014, 22:07
|
|
Профессор
|
|
Регистрация: 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-ах будут выполняться вне зависимости от того, равны ли они с результатом вычисления входного выражения, выполняться сам понимаешь до какого момента
|
|
|
|