看似相等的字符串的奇怪问题

时间:2012-11-27 23:59:48

标签: javascript

我知道这可能看起来很傻,但我仍然不知道为什么会这样(已经好几次了。)

alert(
"WWVhaCA6RCwgYSBsb3Qgb2YgcGVvcGxlIGRvbid0IGtub3cgdGhhdCB0aGlzIGlzIGVuY29kZWQgOkQ=" == 
"WWVhaCA6RCwgYSBsb3Qgb2YgcGVvcGxlIGRvbid0IGtub3cgdGhhdCB0aGlzIGlzIGVuY29kZWQgOkQ=")​

演示:http://jsfiddle.net/DerekL/b38Cn/

它应该返回true,而是返回false。我查看了每个字符(在记事本中,因为它使用等宽字体),它们完全相同。

4 个答案:

答案 0 :(得分:4)

正如@ElliotBonneville所说,文本中有一个隐藏的unicode字符。通过将字符串粘贴到命令提示符中可以看到它:

screenshot

注意第一个字符串末尾的?

答案 1 :(得分:4)

奇怪的是,当我复制&将代码粘贴到我的编辑器中,我最终得到了这个:

  

“WWVhaCA6RCwgYSBsb3Qgb2YgcGVvcGxlIGRvbid0IGtub3cgdGhhdCB0aGlzIGlzIGVuY29kZWQgOkQ = <强>吗”

和第二部分:

  

“WWVhaCA6RCwgYSBsb3Qgb2YgcGVvcGxlIGRvbid0IGtub3cgdGhhdCB0aGlzIGlzIGVuY29kZWQgOkQ =”

请注意第一个字符串中的额外“”?视觉上在jsFiddle上它没有出现。 我复制了你的字符串并删除了额外的并在jsFiddle上运行它。它运作良好。

答案 2 :(得分:3)

你是否从jsFiddle或其他东西复制了这个字符串?有一个Unicode字符没有出现在记事本或我的浏览器中(Chrome,如果你想知道的话)并且导致了这个问题。复制第一个字符串并将其粘贴到第二个字符串中(在确认两个出现相同之后)导致问题消失。

我会将链接粘贴到更新的jsFiddle,但我不允许这样做。

答案 3 :(得分:3)

zero width non breaking space打招呼!

您的第一个字符串最后包含0xfeff个字符。这在大多数现代编辑中都没有出现,这可能就是你甚至没有注意到它的原因。

  

零宽度不间断空间(ZWNBSP)是在代码点U + FEFF处不推荐使用Unicode字符。字符U + FEFF旨在用作文件开头的字节顺序标记。但是,如果遇到其他地方,根据Unicode,它应该被视为“零宽度不间断空间”。为此目的故意使用U + FEFF现已弃用,U + 2060 word joiner(HTML:⁠)是首选。

来源:wikipedia

当你遇到看似相同的字符串时,你应该在循环中使用.charCodeAt()将它们分解,以找到任何“流氓”字符。