javascript真是奇怪的行为

javascript真是奇怪的行为,javascript,race-condition,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; } 我遇到

我有以下代码

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

有什么想法吗?

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

另外,我假设你真的打算在if和else-if条件之后有{如果没有,那可能会导致各种奇怪的行为,这取决于出于简洁性考虑而删除的代码。如果没有,那么在else条件之前有一个无关的}

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

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

另外,我假设你真的打算在if和else-if条件之后有{如果没有,那可能会导致各种奇怪的行为,这取决于出于简洁性考虑而删除的代码。如果没有,那么在else条件之前有一个无关的}


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

是否尝试将语句更改为

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

你有没有试着把陈述改成

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

==比==更严格,并且通常很有用。但这是与这里的问题相反的问题,有些东西看起来是相等的,但不是==或===如果有些东西不是==,它将永远不会是===


msg.position是字符串吗?它可能包含空格或其他类似字符。

===比==更严格,通常很有用。但这是与这里的问题相反的问题,有些东西看起来是相等的,但不是==或===如果有些东西不是==,它将永远不会是===

msg.position是字符串吗?它可能包含空格或其他类似字符。

如果使用

parseInt(msg.position)
如果没有基数,08和09将遇到问题,因为它们被解析为八进制数并给出NaN。始终使用基数:

parseInt(msg.position, 10)
如果你使用

parseInt(msg.position)
如果没有基数,08和09将遇到问题,因为它们被解析为八进制数并给出NaN。始终使用基数:

parseInt(msg.position, 10)

今天,我的一个js模块中的校验和值出现了这个问题。一项测试显示两个值不相等,但打印这些值表明它们相等

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

我使用一个自定义例程将它们格式化为十六进制,这可能与此有关。但在你的情况下,这种情况似乎不太可能发生


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

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

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

我使用一个自定义例程将它们格式化为十六进制,这可能与此有关。但在你的情况下,这种情况似乎不太可能发生


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

我有代码'msg.position=parseIntmsg.position;'在提供代码之前稍早一点。@teehoo:您还应该将,10参数传递给parseInt,这样就不会意外地将该数字误认为是八进制/十六进制数字

R如果没有此参数,字符串中的前导零将导致数字被解释为八进制。确定setTimeout函数是否调用了此代码?这实际上是javascript中出现竞态条件的唯一方法。当ajax请求成功返回时,将调用此代码。这符合条件吗?我有代码'msg.position=parseIntmsg.position;'在提供代码之前稍早一点。@teehoo:您还应该将,10参数传递给parseInt,这样就不会意外地将该数字误认为八进制/十六进制数字。如果没有此参数,字符串中的前导零将导致数字被解释为八进制。确定setTimeout函数是否调用了此代码?这实际上是javascript中出现竞态条件的唯一方法。当ajax请求成功返回时,将调用此代码。这符合条件吗?从现在起,我将使用'=''运算符,不幸的是,它没有解决本例中的问题。对于方括号,在'if'和'elseif'块之后只有一行语句。您是否尝试添加一个变量来保存txtArea.value.length的值?这将消除对比较和调试打印之间的值更改的任何担忧。等等,您只有一行if和else if上没有大括号,但在最后一行else之前有一个右大括号?这似乎会导致分支发生与您预期的不同。你可能想检查一下。@Hank如果是这样的话,这会不会违反javascript单线程模型?@jhurshman你是对的,这是我示例代码中的一个输入错误,我更新/修复了这个问题。从现在起我将使用“==”操作符,不幸的是,它没有解决这个问题。对于方括号,在'if'和'elseif'块之后只有一行语句。您是否尝试添加一个变量来保存txtArea.value.length的值?这将消除对比较和调试打印之间的值更改的任何担忧。等等,您只有一行if和else if上没有大括号,但在最后一行else之前有一个右大括号?这似乎会导致分支发生与您预期的不同。你可能想检查一下。@Hank如果是这样的话,这会不会违反javascript单线程模型?@jhurshman你是对的,这是我示例代码中的一个输入错误,我更新/修复了这个问题。如果是字符串,那么===将揭示这个事实。这是我最喜欢的使用它的好处。msg.position使用'msg.position=parseIntmsg.position,10;'在示例代码之前。如果是字符串,则===将揭示该事实。这是我最喜欢的使用它的好处。msg.position使用'msg.position=parseIntmsg.position,10;'在示例代码之前,我从来都不知道这一点。但对这件事没有帮助,我从来都不知道。但在这种情况下没有帮助。在这种罕见的情况下,msg.position是什么?特别是,记录它的类型。在这些罕见的情况下,msg.position是什么?特别是,记录它的类型。