2008-10-30 164 views
10

我在寫某些JavaScript時出現問題,其中Switch語句似乎沒有按預期工作。JavaScript switch語句

switch (msg.ResultType) { 
    case 0: 
    $('#txtConsole').val("Some Val 0"); 
    break; 
    case 1: 
    $('#txtConsole').val("Some Val 1"); 
    break; 
    case 2: 
    $('#txtConsole').text("Some Val 2"); 
    break; 
} 

ResultType是一個整數值0-2,我可以看到在FireBug中。在所有情況下,交換機都將控制轉移到最終中斷語句,這意味着所有的邏輯都被完全跳過。我錯過了什麼?

回答

19

的區別我敢肯定,開關在ActionScript和JS以來和AS都遵循ECMAScript標準,我想同樣也適用於JS使用===進行比較。我的猜測是,該值實際上不是一個數字,但可能是一個字符串。

您可以嘗試在交換機中使用parseInt(msg.ResultType)或在案例中使用字符串。

+8

總是指定parseInt的第二個參數!這是基數,所以你可能會想要:parseInt(msg.ResultType,10);如果你不提供它,它會嘗試猜測基數和可怕的事情會發生。 – rmeador 2008-10-30 14:12:29

+0

好吧,只有當你傳遞像077這樣的東西時,纔會發生可怕的事情,例如,它會被解釋爲八進制(但不是078),或者0x10,但在第二種情況下,很明顯你的基數爲16。基數明顯不會受到傷害,所以也不是一個壞主意。 – 2008-10-30 14:25:45

2

我遇到了類似的問題,結果問題是,當它顯示爲一個int值時,switch語句將其作爲字符串變量讀取。可能不是這種情況,但那是發生在我身上的事情。

0

確定ResultType是整數(例如0)而不是字符串(例如「0」)?

這很容易解釋的行爲

+0

它絕對是一個根據FireBug的整數。並不是說這是一個明確的來源,而是一個很好的指標。 – 2008-10-30 14:09:06

0

它看起來像將其更改爲parseInt(msg.ResultType)已強制JavaScript引擎將其正確地視爲一個整數。謝謝您的幫助。

2

試試這個:

switch (msg.ResultType-0) { 
    case 0: 
    $('#txtConsole').val("Some Val 0"); 
    break; 
    case 1: 
    $('#txtConsole').val("Some Val 1"); 
    break; 
    case 2: 
    $('#txtConsole').text("Some Val 2"); 
    break; 
} 

-0將迫使(要挾)它來治療你值爲整數,不改變的值,它比parseInt函數短得多。

0

我注意到的第一件事是,在三種情況中的兩種情況下,您調用.val(),第三種情況下調用.text()。

如果您嘗試將case語句更改爲字符串而不是ints,那麼我唯一能想到的就是您在訪問未定義的變量時可能會在某處發生異常。

0

可能是最強大的威壓在ES5爲int提供的是:

 msg.ResultType | 0 

這是基石上asm.js所在之一。這導致非常優化ES5,並通過編制上存在使用:

"use asm" 

指令(在FF和鉻)。這種強制導致Int32類型被用於表示「int」的ES5中的Numbers。所以從5年前的原始問題的廚師書配方解決方案是這樣的:

"use strict" ; 
$("#txtConsole").val(
    switch (msg.ResultType | 0) { 
    case 0: 
      "Some Val 0"; 
    break; 
    case 1: 
     "Some Val 1"; 
    break; 
    case 2: 
     "Some Val 2"; 
    break; 
    default : 
     "Illegal ResultType"; 
    });