2010-05-28 95 views
1

我有以下代碼JavaScript的真正奇怪的行爲

if (msg.position == 0) 
    //removed for brevity 
else if (msg.position == txtArea.value.length) 
    //removed for brevity 
else { 
    //ERROR: should not reach here. 
    errorDivTag.innerHTML += msg.position + " " + txtArea.value.length; 
} 

我在那裏,我發現了錯誤,在過去的代碼塊中的一些很奇怪的情況,但印刷位置顯示msg.position其實等於txtArea.value.length。這隻發生在1%的時間內,就好像我的代碼中存在某種競爭條件,在第二條if語句中這兩個條件不相等,但在打印錯誤消息時卻是相等的。

任何想法?

+0

什麼是'msg.position'(在這些罕見的情況下)?特別是,記錄'typeof'它。 – Bergi 2012-09-30 19:47:22

回答

2

首先,始終使用===。這將阻止JavaScript自動強制比較類型,這意味着您可以更輕鬆地發現各種錯誤。在這種情況下,你可能會有一些空白(這在輸出中基本上是不可能的),而不是(我假設)所需的數字比較會導致字符串比較。

此外,我假設您真的有意在ifelse if條件後有{。如果不是,那可能會導致各種奇怪的行爲,這取決於您爲了簡潔起見而刪除的代碼。如果你沒有,那麼在else條件之前你有一個無關的}

UPDATE:在Firebug/DeveloperTools/DragonFly/whatever中設置一個斷點,並在比較發生時檢查這些值。

+0

從現在開始,我將使用'==='運算符,但不幸的是,它並沒有解決這種情況下的問題。而在括號的情況下,我只在'if'和'elseif'塊之後有一行語句。 – 2010-05-28 17:11:33

+0

您是否嘗試添加一個變量來保存'txtArea.value.length'的值?這應該消除關於比較和調試打印之間值變化的任何顧慮。 – 2010-05-28 17:18:09

+0

等一下,你的'if'和'else if'只有一行(沒有大括號),但是在最後一個'else'之前有一個右大括號?這似乎可能導致分支的發生與您預期的不同。你可能想檢查一下。 – jhurshman 2010-05-28 17:19:43

1

你嘗試改變語句...

parseInt(msg.position, 10) == txtArea.value.length 
+0

我有代碼'msg.position = parseInt(msg.position);'在代碼提供之前稍早。 – 2010-05-28 17:05:25

+1

@teehoo:您還應該將',10'參數傳遞給'parseInt',所以這個數字不會被誤認爲八進制/十六進制數。 (如果沒有這個參數,IIRC字符串中的前導零將導致數字被解釋爲八進制數。) – 2010-05-28 17:20:57

+0

ok這個代碼是否被setTimeout函數調用了?這真是唯一的方式可能會出現在JavaScript的競爭條件,如果有的話。 – davydotcom 2010-05-28 17:24:43

1

===比更嚴格的==和往往是有用的。但是這與你在這裏的東西相反,在某些東西看起來相同的情況下,但不是==或===(如果某些東西不是==,它永遠不會===)。

msg.position是字符串嗎?也許它包含一個空格或其他類似的字符。

+0

如果它是一個字符串,那麼'==='會揭示這個事實。這是我使用它的最大好處。 – 2010-05-28 17:29:07

+0

msg.position正在使用'msg.position = parseInt(msg.position,10);'之前的示例代碼。 – 2010-05-28 17:59:15

3

如果使用

parseInt(msg.position) 

沒有基數,你會遇到與08和09的問題,因爲他們被解析爲八進制數字,並給予NaN的。總是使用一個基數:

parseInt(msg.position, 10) 
+0

我從來不知道這一點。但在這種情況下並沒有幫助。 – 2010-05-28 17:59:42

1

我今天有這個問題,在我的js模塊之一的校驗和值。一項測試顯示兩個值不相等,但打印值顯示他們相等。

在調試器中對其進行調整並(重新)發現Javascript中的整數類型是64位浮點數。其中一個數字在調試器中顯示爲負數 - 正好(0xFFFFFFFF + 1)小於另一個數字。不知何故,當打印時,他們顯示完全一樣。

我正在使用自定義例程來格式化它們在十六進制,這可能與它有關。儘管如此,情況似乎不太可能。

我發現了我的代碼中的符號問題,通過計算數字之間的增量並顯示它。它顯示爲MAX_UINT32 + 1,這提醒我這些數字實際上是64位浮點數。