2011-02-24 80 views
1

以及我有這個麻煩,我一直都應付,但我只是不能得到它的工作麻煩SWITCH JavaScript的執行總是默認情況下

我有這個功能

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(變量),該函數在第一次調用時運行良好,但在此之後,它始終輸入默認子句,並且它還提示'進入的默認方向= dirvalue',我的意思是,即使目標是介於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

如果你在函數頂部記錄'dir',你會得到預期的結果嗎? – alex 2011-02-24 01:27:54

+0

請顯示你的計時器。 – 2011-02-24 01:28:48

+1

代碼在firefox中對我來說工作正常,是否還有其他代碼參與?你使用的是什麼瀏覽器?你也可能想添加'var img =「」;',因爲它會在追加時嘗試將兩個操作數轉換爲字符串,並且由於你沒有初始化img,它就變成了「未定義」。 :) – 2011-02-24 01:35:47

回答

6

這是奇怪...嘗試,以確保dir是一個int,交換機之前:

dir = parseInt(dir); 

如果警報顯示值正確,應該進入交換機,但它仍然可以「看起來」是正確的,但是是不同的數據類型。手動進行轉換以確保它是一個int

+1

parseInt不是必需的。 '+'一元運算符是要走的路:'switch(+ dir){...' – 2011-02-24 01:48:37

+0

好吧,你是對的,它似乎是提取的數據是字符串,所以只需添加parseInt的工作,以及改變案例1:案例'1': – Gustavo 2011-02-24 01:55:13

+1

你可以轉換爲多種不同的方式,它只是代碼風格: )我更喜歡在做轉換時明確表示,而不是像非JavaScript的程序員(或初學者)無法理解的那樣使用+ dir之類的東西。 – AlfaTeK 2011-02-24 01:58:49

0

很難解釋爲什麼,但default:情況下也需要一個break;聲明後,像所有其他案例。

+3

...不一定,因爲這是最後一個。儘管如此,爲了便於閱讀,仍然是一個好主意。 – 2011-02-24 01:30:40

2

我猜想,由於某種原因,dir被作爲字符串傳入。嘗試更改案例1:案例'1':

2

使用數組而不是if/else塊或巨型開關語句的鏈將會更快,更靈活,更不容易出錯。另外,如果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 usi ng數組將會是:

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(' '); 

或使用閉合。

+1

確保你先將'dir'轉換爲int。這是一個更清潔的解決方案,但仍不能解釋用戶遇到的問題。 :) – 2011-02-24 01:37:03

+0

如果問題是'dir'是一個字符串,那麼它將以這種方式工作。看到這個小提琴:http://jsfiddle.net/cAg58/ – rsp 2011-02-24 01:43:49

+0

1.它必須是'+ =',而不是'='。 2.你可以取出'.png'後綴來刪除冗餘。然後:'img + = arr [dir] +'.png';' – 2011-02-24 01:46:50

0

我只是跑在Firefox /螢火蟲的代碼和調用的函數這樣

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

第一個正確的做它和接下來的兩個輸入default。 他們是字符串,而不是整數,這是案件正在尋找。 我加

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

,然後只有中間一個進入default。很明顯,您調用該函數的方式存在問題。它可能傳遞一個字符串。 我還用你if-else塊(增加了一個else{alert(dir);}和各個調用返回正確的值。

的JavaScript可以動態轉換(我認爲有應該是一個更好的詞)的字符串和整數(和其他人之間做)這是當你使用==的comparrison如果更改ifs===你會得到相同的行爲與switch塊的比較存在的。

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調用交換機版本時,它按預期工作。使用'2'進行調用可使其進入default行。在這兩種情況下,if-else版本都按預期工作。所以問題可能是switch不會執行隱式轉換,==會。

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; 
} 

這是不一樣的一系列double等於(==),但一系列三等於(===)。這將相當於:

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」,而不是在「===」土地。