Заявление о переключении Javascript - очень просто, что я делаю не так? - PullRequest
4 голосов
/ 15 декабря 2010

Я уверен, что на этот вопрос должен быть действительно простой ответ, но есть риск казаться глупым - я не могу заставить этот оператор switch работать.Входная переменная «status» может быть «public» или «draft», и я могу заверить вас, что он содержит только одно из этих двух значений, поскольку я предупреждал об этом на различных этапах, и в любом случае оператор if здесь работает,Взгляните:

        function switch_status(status){
            if (status == 'public'){
                return false;
            } if (status == 'draft') {
                return true;
            }

^ Это работает, но замена приведенного ниже выражения 'if' на 'switch' не работает.

            switch(status){
            case 'public':
                return false;
            case 'draft':
                return true;
            }
        }

Первый, кто предоставил мнес неизбежным смущающим простым ответом выигрывает мою награду!

РЕДАКТИРОВАТЬ: Вот мой полный код -

        $('.status').live('click',
                function(){
                    fullClass = $(this).attr('class');
                    id = fullClass.split(' ').slice(-1);
                    status = fullClass.split(' ').slice(-2,-1);
                    var newStatus = switch_status(status);
                    alert(newStatus);
            });

        function switch_status(status){
//              if (status == 'public'){
//                  return false;
//              } if (status == 'draft') {
//                  return true;
//              }

            switch(status){
                case 'public':
                    return false;
                case 'draft':
                    return true;
            }
        }

Ответы [ 3 ]

4 голосов
/ 15 декабря 2010

Вы передаете status как массив из одной строки (результат slice), а не просто как строку.

Когда вы проверяете равенство между вашим массивом и строкой, кажется, что принуждение вызывает проверку на равенство Но принуждение не происходит в операторе switch.

Если я изменюсь

status = fullClass.split(' ').slice(-2,-1);

до

status = fullClass.split(' ').slice(-2,-1)[0];

тогда все работает нормально.

1 голос
/ 15 декабря 2010

Я подозреваю, что эта проблема возникает из-за преобразования типов.

Обычно Javascipt является свободно типизированным языком.Оператор if, который вы использовали ранее, использовал свободное сравнение ==.Это сработало просто отлично.

Однако операторы switch - это другое дело.Чтобы совпадение наблюдалось, типы данных должны совпадать.Другими словами, status должен быть преобразован в строку перед передачей в оператор switch.

0 голосов
/ 01 мая 2013

Я использовал .each в цикле jquery и сравнил значение с 'this';Я мог ясно видеть, что «this» имеет правильное значение, если я использовал console.log.Это работало в логике if / else, но не в логике switch / case.

Решение:

var obj = this.toString ();

switch(obj){
    case 'one': ...
    case 'two': ...
}

Путем принудительного использования this в типе строкиТеперь логика в коммутаторе работает.

...