我有以下代码
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 :(得分: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位浮点数。