2011-10-10 90 views
7

我在随机基础上发生了一个在我的JS应用程序中出现的奇怪错误。基本上,脚本无法准确比较两个字符串。更具体地说,有时看不到两个完全相同的字符串:('blah' == 'blah')返回falseJavaScript字符串比较随机失败

有趣的是,在另一次尝试中,相同的两个字符串可能被认为是相同的(语句返回true)。我从未设法弄清楚这种模式。我也尝试使用===而不是==;这没有帮助。

我想不出一个更好的方式来证明和证明这个荒谬的错误,而不是通过录制屏幕录像。所以这里是:http://www.screenr.com/klOs。我不断给出该视频中每个测验的正确答案,但接近尾声的是,我对“日本”和“台湾”的答案将被视为“错误”;控制台还会显示给定的答案字符串,正确的答案字符串以及比较结果(false?!!)。

那么,这种奇怪的行为可能是什么原因,我怎么解决它?

您可以在截屏视图中看到带有比较声明的代码。该“params.givenAnswer”直接来自于按钮上的文字标签:

//*** 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谢谢@JAAulde和@Mike!我一直在努力,包括引号,并在记录了var类型,我得到了这样的结果:

enter image description here

现在很清楚为什么字符串比较失败:有似乎是种额外的换行符第一个字符串。这还是很奇怪的,因为它在上次采伐中并没有出现空白的新线,最重要的是,它随机出现(注意这次“台湾”被接受了,没有任何问题)。

我已经包含了一个简单的换行符去除规则的答案字符串,现在一切似乎工作正常。非常感谢大家!

+0

截屏并没有清楚地表明这些值是'string's,而不是'String'或'Object's'toString'方法。也许你的日志记录应该包括被比较的“typeof”值。 –

+2

调整你的日志记录,使得输出的字符串用引号括起来:'console.log('''+ value +'''';''这可能是你有一些空白问题。记录'typeof'也会很好。 – JAAulde

+1

这很奇怪。你在混合编码(ISO-8859-1,UTF-8)还是什么?在比较之前试过两个运行'.toString()'? –

回答

0

使用===是一种严格的平等比较。这意味着数据类型和内容正在进行比较。它们(数据和类型)必须相同才能返回true。

当您将严格比较切换为==时,即使数据类型不同,测试也应该有效。然而,由于多余的空格,它失败了。