SWITCH javascript总是执行默认情况的麻烦

时间:2011-02-24 01:25:39

标签: javascript switch-statement

好吧,我有这个麻烦,我一直在处理,但我不能让它工作

我有这个功能

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(变量),该函数在第一次调用时工作良好但在此之后,它总是输入default子句并且它还会警告'输入默认值但方向= dirvalue',我的意思是即使dir是一个介于0-7之间的值,它总是会进入默认值:但是它会提醒值,所以它被用来输入其中一个案例。

我使用其他如果并且它有效,所以我不知道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 个答案:

答案 0 :(得分:8)

这很奇怪...尝试确保dir是一个int,在切换之前执行此操作:

dir = parseInt(dir);

如果警报正确显示值,它应该进入开关,但它仍然可以“看起来”正确但是具有不同的数据类型。手动进行转换以确保它是一个int

答案 1 :(得分:3)

我知道我参加派对有点晚了,但我认为对于那些不理解为什么“ifs”工作且切换没有的人来说,这可能很重要。很可能没有人会读到这个答案,但是我在搜索其他东西时发现了这个答案,所以也许有人会觉得这个有用了:

您的开关是这样的:

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 :(得分:2)

我猜是因为某种原因dir作为字符串传入。尝试将案例1更改为案例'1':

答案 3 :(得分:2)

使用数组而不是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(' ');

或使用封闭。

答案 4 :(得分:0)

很难解释原因,但default:案例在所有其他案例之后也需要break;语句。

答案 5 :(得分:0)

我刚刚在FireFox / FireBug中运行代码并以这种方式调用函数

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

第一个正确地执行,接下来的两个进入default。 它们是字符串而不是整数,这是案例所寻求的。 我添加了

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

然后只有中间的一个进入default。显然,调用函数的方式存在问题。它可能传递一个字符串。 我还使用了您的if-else块(添加了else{alert(dir);},并为每次调用返回了正确的值。

Javascript可以在字符串和整数(以及其他字符串)之间进行即时转换(我认为这是一个更好的词)。使用==进行比较时会发生这种情况。如果您将ifs中的比较更改为===,则会获得与switch块相同的行为。

答案 6 :(得分:0)

我将您的代码粘贴到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调用switch-version时,它按预期工作。使用'2'进行调用会使其进入default行。 if-else版本在两种情况下都按预期工作。所以问题可能是switch没有进行隐式转换而==没有。