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% の確率でしか発生しません。これは、2 番目の if ステートメントでは 2 つが等しくなく、エラー メッセージを出力すると等しくなるような競合状態がコードに含まれているかのようです。

何か案は?

4

5 に答える 5

3

使用する場合

parseInt(msg.position)

基数がないと、08 と 09 で問題が発生します。これらは 8 進数として解析され、NaN が返されるためです。常に基数を使用します。

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

まず、常に使用します===。これにより、JavaScript が比較で型を自動的に強制することがなくなります。つまり、あらゆる種類のバグをはるかに簡単に発見できるようになります。この場合、必要な数値比較ではなく、文字列比較を引き起こしている空白 (基本的に出力では確認できない) が含まれている可能性があります。

また、私はあなたが本当にあなたの条件{の後に持っているつもりだったと思います. そうでない場合、簡潔さのために削除したコードによっては、あらゆる種類の奇妙な動作が発生する可能性があります。そうでない場合は、状態の前に余分なものがあります。ifelse if}else

UPDATE : 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

今日、js モジュールの 1 つでチェックサム値にこの問題がありました。テストでは、2 つの値が等しくないことが示されていましたが、値を印刷すると、それら等しいことが示されました。

デバッガーで実行し、Javascript の整数型が 64 ビットの浮動小数点数であることを (再) 発見しました。数値の 1 つがデバッガーで負の値として表示されていました。他の数値よりも正確に (0xFFFFFFFF+1) 小さくなっています。どういうわけか、印刷するとまったく同じように表示されました。

カスタム ルーチンを使用して、それらを 16 進数でフォーマットしていましたが、これはおそらくそれと関係がありました。ただし、その状況の組み合わせはあなたの場合にはありそうにありません。

数値間のデルタを計算し、それを表示することで、コード内の符号の問題を発見しました。MAX_UINT32 + 1 として表示され、これらの数値が実際には 64 ビット浮動小数点数であることを思い出しました。

于 2010-05-28T18:02:07.920 に答える
1

=== は == より厳密であり、しばしば便利です。しかし、これはあなたがここに持っているものとは反対の問題であり、何かが等しいように見えますが、== または === ではありません (何かが == でない場合、それは決して === にはなりません)。

msg.position は文字列ですか? おそらく、スペースまたは別の同様の文字が含まれています。

于 2010-05-28T17:17:54.810 に答える