我有这个功能
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';}
答案 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
没有进行隐式转换而==
没有。