2010-05-28 133 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位浮点数。