проблема с SWITCH JavaScript всегда выполняется по умолчанию - PullRequest
2 голосов
/ 24 февраля 2011

ну, у меня есть эта проблема, и я имел дело с ней, но я просто не могу заставить ее работать

У меня есть эта функция

function getDirections(dir)
{
var img;
switch(dir)
    {
    case 0:
    img+='N.png';
    break;  
    case 1:
    img+='NE.png';
    break;
    case 2:
    img+='E.png';
    break;
    case 3:
    img+='SE.png';
    break;
    case 4:
    img+='S.png';
    break;
    case 5:
    img+='SO.png';
    break;
    case 6: 
    img+='O.png';
    break;
    case 7:
    img+='NO.png';
    break;
    default:
    alert('enetered default but direction='+dir);
    }
return img;
}

довольно просто, верно? теперь у меня установлен интервал в 5000 мс для вызова getDirections (переменная), функция работает хорошо при первом вызове, но после этого она всегда вводится в предложении по умолчанию и также предупреждает «введено значение по умолчанию, но direction = dirvalue», Я имею в виду, что даже если dir - это значение в диапазоне от 0 до 7, оно всегда будет входить в значение по умолчанию: но оно будет предупреждать о значении, так что его нужно будет ввести в один из случаев.

Я сделал то же самое, используя else, если и это сработало, поэтому я не знаю, что с SWITCH

if(dir==0){img+='N.png';}
else if(dir==1){img+='NE.png';}
else if(dir==2){img+='E.png';}
else if(dir==3){img+='SE.png';}
else if(dir==4){img+='S.png';}
else if(dir==5){img+='SO.png';}
else if(dir==6){img+='O.png';}
else if(dir==7){img+='NO.png';}

Ответы [ 7 ]

8 голосов
/ 24 февраля 2011

Это странно ... попробуйте убедиться, что dir - это int, сделайте это до переключения:

dir = parseInt(dir);

Если предупреждение правильно показывает значение, оно должно войти в коммутатор, но все равно оно может «выглядеть» правильно, но иметь другой тип данных. Выполните преобразование вручную, чтобы убедиться, что это int

3 голосов
/ 05 сентября 2012

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

Ваш переключатель таков:

function getDirections(dir) {
    var img;
    switch(dir) {
        case 0:
            img+='N.png';
            break;  
        case 1:
            img+='NE.png';
            break;
        case 2:
            img+='E.png';
            break;
        case 3:
            img+='SE.png';
            break;
        case 4:
            img+='S.png';
            break;
        case 5:
            img+='SO.png';
            break;
        case 6: 
            img+='O.png';
            break;
        case 7:
            img+='NO.png';
            break;
        default:
            alert('enetered default but direction='+dir);
    }
    return img;
}

Этоне то же самое, что серия двойных равных (==), но серия тройных равных (===).Это было бы эквивалентно:

if (dir === 0) {
    img+='N.png';
} else if (dir === 1) {
    img+='NE.png';
} else if (dir === 2) {
    img+='E.png';
} else if (dir === 3) {
    img+='SE.png';
} else if (dir === 4) {
    img+='S.png';
} else if (dir === 5) {
    img+='SO.png';
} else if (dir === 6) {
    img+='O.png';
} else if (dir === 7) {
    img+='NO.png';
} else {
    alert('enetered default but direction='+dir);
}

В мире "==" целое число 2 - то же самое, что и строка "2", но не в стране "===".

2 голосов
/ 24 февраля 2011

Использование массива вместо цепочки блоков if / else или гигантского оператора switch будет быстрее, более гибким и менее подверженным ошибкам.Кроме того, вам не придется беспокоиться, если dir - это число или строка.Вместо:

if(dir==0){img+='N.png';}
else if(dir==1){img+='NE.png';}
else if(dir==2){img+='E.png';}
else if(dir==3){img+='SE.png';}
else if(dir==4){img+='S.png';}
else if(dir==5){img+='SO.png';}
else if(dir==6){img+='O.png';}
else if(dir==7){img+='NO.png';}

вы можете сохранить имена файлов в массиве:

var images = [
    'N.png', 'NE.png', 'E.png', 'SE.png', 'S.png', 'SO.png', 'O.png', 'NO.png'
];

или, возможно, более читабельно:

var images = "N.png NE.png E.png SE.png S.png SO.png O.png NO.png".split(' ');

, а затем использовать просто:

img = images[dir];

Полная реализация getDirections с использованием массива будет выглядеть следующим образом:

var images = "N.png NE.png E.png SE.png S.png SO.png O.png NO.png".split(' ');
function getDirections(dir) {
    var img = images[dir];
    if (!img) {
        alert("something");
    }
    return img;
}

Работает ли он для вас?

Если images используется только в этомфункция, тогда вы можете сохранить его как свойство функции, чтобы избежать загрязнения пространства имен, например:

function getDirections(dir) {
    var img = getDirections.images[dir];
    if (!img) {
        alert("something");
    }
    return img;
}
getDirections.images =
    "N.png NE.png E.png SE.png S.png SO.png O.png NO.png".split(' ');

или использовать замыкание.

2 голосов
/ 24 февраля 2011

Я предполагаю, что по какой-то причине dir передается в виде строки. Попробуйте изменить регистр 1: на регистр '1':

0 голосов
/ 24 февраля 2011

Я вставил ваш код в файл HTML и запустил его с помощью следующих кнопок:

<button onclick="alert(getDirections(2))">Switch / Int</button>
<button onclick="alert(getDirections('2'))">Switch / String</button>
<button onclick="alert(getDirections2(2))">If-Else / Int</button>
<button onclick="alert(getDirections2('2'))">If-Else / String</button>

При вызове версии коммутатора с простым значением 2, он работает как положено. Вызов его с помощью '2' заставляет его перейти к строке default. Версия if-else работает как положено в обоих случаях. Таким образом, проблема, вероятно, в том, что switch не выполняет неявное преобразование, а == делает.

0 голосов
/ 24 февраля 2011

Я просто запустил код в FireFox / FireBug и вызвал функцию следующим образом

getDirections(0);
getDirections('1');
getDirections("2");

Первый делает это правильно, а следующие два вводят default. Они являются строками, а не целыми числами, что и ищут случаи. Я добавил

case "2":
img+='NO2.png';
break;

, а затем только середина вошла в default. Очевидно, есть проблема с тем, как вы вызываете функцию. Это скорее всего передача строки. Я также использовал ваш блок if-else (добавил else{alert(dir);}, и он возвращал правильное значение для каждого вызова.

Javascript может выполнять преобразование «на лету» (я думаю, что есть лучшее слово для этого) между строками и целыми числами (и другими). Это происходит, когда вы делаете сравнение, используя ==. Если вы измените сравнение в ifs на ===, то получите то же поведение, что и в блоке switch.

0 голосов
/ 24 февраля 2011

Трудно объяснить, почему, но в случае default: после него также требуется оператор break;, как и во всех других случаях.

...