2011-10-10 14 views
7

私のJSアプリケーションでランダムに発生するかなり変なバグがあります。基本的に、スクリプトは2つの文字列を正確に比較できません。より具体的には、時には同一の2つの同一の文字列が表示されません。('blah' == 'blah')falseを返します。JavaScript文字列の比較がランダムに失敗する

面白いことに、別の試行では、同じ2つの文字列が同一であることが認められます(ステートメントはtrueを返します)。パターンを理解することは決してできませんでした。私も==の代わりに===を使用しようとしました。これは役に立たなかった。

私はスクリーンキャストを録音する以外に、このばかげたバグを実証して証明するためのより良い方法を考えることができませんでした。だからここにある:http://www.screenr.com/klOs。私はそのビデオの各クイズについて正解を続けていますが、最後には「日本」と「台湾」の答えが「間違っている」とみなされます。コンソールには、指定された応答文字列、正しい応答文字列、およびその比較結果(false?!!)も表示されます。

このような奇妙な振る舞いの原因となる可能性のあることは何ですか。

あなたはスクリーンキャストで比較文を使ってコードを見ることができます。あなた@JAAuldeと@マイクをありがとう

//*** Options for answering the card quiz 
quizOptions = new Ext.Panel({ 
     id: 'quizOptions', 
     […………] 
     listeners: { 
      el: { 
       scope: this, 
       tap: this.checkAnswer 
      } 
     } 
}); 


checkAnswer: function(container, element) { 

    // Get the text value of the button clicked 
    var answer = Ext.fly(element).dom.innerText; 

    Ext.dispatch({ 
     controller: 'Practice', 
     action: 'checkAnswer', 
     givenAnswer: answer 
    }); 
}, 

UPDATE:「params.givenAnswerは、」ボタンのテキストラベルから直接来ます!私は、ロギングに引用符とVARのタイプを含めることを試みていると私はこの結果を得た:文字列比較が失敗した理由を

enter image description here

は、今では明らかだ:中種の余分な改行があるように思われます最初の文字列。以前のログでは空白の新しい行として表示されなかったので、それはまだ非常に奇妙です。そして、最も重要なのは、無作為にそこに現れます(今回は台湾が何の問題もなく受け入れられたことに気づくでしょう)。

回答文字列に簡単な改行除外ルールを追加しましたが、すべて正常に動作しているようです。みなさんありがとう!

+0

スクリーンキャストでは、値が 'string'であり、' toString'メソッドでは 'String'や' Object'ではないことが明らかになりました。たぶん、あなたのロギングは、比較される値の 'typeof'を含むべきです。 –

+2

出力される文字列が引用符で囲まれるようにログを調整します。 'console.log( '"' + value + '"');'空白の問題がある可能性があります。 'typeof'のロギングも良いでしょう。 – JAAulde

+1

それは非常に奇妙です。あなたはエンコーディング(ISO-8859-1、UTF-8)などをミックスしていますか?比較の前に両方で '.toString()'を実行しようとしましたか? –

答えて

0

===を使用することは完全な等価比較です。これは、データ型と内容が比較されていることを意味します。それらは両方とも(データと型)は等しく、真を返す必要があります。

厳密な比較を==に変更したとき、データ型が異なっていてもテストは機能するはずでした。しかし余分な空白のために失敗しました。