javascript真的很奇怪的行为

时间:2010-05-28 16:55:10

标签: javascript race-condition

我有以下代码

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语句中不相等,但在错误消息中打印时相等。

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

如果您使用

parseInt(msg.position)

没有基数,你会遇到08和09的问题,因为它们被解析为八进制数并给出NaN。始终使用基数:

parseInt(msg.position, 10)

答案 1 :(得分:2)

首先,请始终使用===。这将阻止JavaScript自动强制比较中的类型,这意味着您将能够更轻松地发现各种错误。在这种情况下,你可能有一些空格(在输出中基本上不可能看到)导致字符串比较而不是(我假设)所需的数字比较。

另外,我假设你真的打算在{if条件之后拥有else if。如果不是,那可能会导致各种奇怪的行为,具体取决于您因简洁问题而删除的代码。如果你没有,那么你在}条件之前就有一个无关的else

UPDATE :在Firebug / DeveloperTools / DragonFly / whatever中设置断点,并在进行比较时检查值。

答案 2 :(得分:1)

您是否尝试将声明更改为...

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

答案 3 :(得分:1)

===比==更严格,通常很有用。但这是与你所拥有的相反的问题,其中某些东西看起来相同,但不是==或===(如果某些东西不是==,它永远不会是===)。

msg.position是字符串吗?也许它包含一个空格或其他类似的角色。

答案 4 :(得分:1)

我今天遇到了这个问题,我的一个js模块中有一个校验和值。测试显示两个值不相等,但打印值显示它们 相等。

在调试器中运行并且(重新)发现Javascript中的整数类型是64位浮动数量。其中一个数字在调试器中显示为负数 - 正好(0xFFFFFFFF + 1)小于另一个数字。不知何故,当打印时,它们显示完全相同。

我使用自定义例程以十六进制格式化它们,这可能与它有关。在你的情况下,这种情况的组合似乎不太可能。

我在代码中通过计算数字之间的差异并显示它来发现符号问题。它显示为MAX_UINT32 + 1,这提醒我这些数字实际上是64位浮点数。