1

我有以下代码

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

有任何想法吗?

4

5 回答 5

3

如果你使用

parseInt(msg.position)

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

parseInt(msg.position, 10)
于 2010-05-28T17:19:02.707 回答
2

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

另外,我假设你真的想拥有{你的ifelse if条件。如果不是,那可能会导致各种奇怪的行为,具体取决于您出于简洁考虑而删除的代码。如果你没有,那么你}在你的else条件之前有一个无关紧要的东西。

更新:在 Firebug/DeveloperTools/DragonFly/whatever 中设置断点,并在比较发生时检查值。

于 2010-05-28T16:59:25.627 回答
1

您是否尝试将语句更改为...

parseInt(msg.position, 10) == txtArea.value.length
于 2010-05-28T17:00:19.977 回答
1

=== 比 == 更严格,而且通常很有用。但这是与您在这里遇到的相反的问题,其中某些东西看起来相等,但不是 == 或 ===(如果某些东西不是 ==,它永远不会是 ===)。

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

于 2010-05-28T17:17:54.810 回答
1

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

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

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

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

于 2010-05-28T18:02:07.920 回答