JavaScript:字符串相等但比较返回false。

3

我目前正在为Textual IRC开发主题,我想将“Topic is…”消息与频道主题栏中显示的主题进行比较,如果它们相同,则删除它们。

引起问题的主题中包含Umlaute和URI,如下所示:

++ Frische Austern ++ Nächste Sitzung: https:/some/uri/that/can/contain/umlaute" ++

当我打印旧主题和新主题时,它们看起来完全相同,包括尾随和前导空格(我使用trim()消除了它们)。

比较是使用

if(oldTopic === newTopic){
    // do stuff
}

我已经尝试过的

类型检查

我使用typeof来确保两个字符串都是string类型而不是Object类型。

消除Umlaut

我使用replace(/ä/g, 'ae')来消除Umlaut。

消除URL

我使用replace(/\//g, '_')来去掉正斜杠,我使用escape()来转义非Unicode字符。

很遗憾,这些方法都没有奏效。如果我使用console.log来显示这两个字符串,它们完全相同。我本来以为可能涉及到一些Unicode的问题,例如用不同的方式表示ä,但是替换也没有奏效。

我想我已经达到了我的JavaScript知识极限,我真的不知道为什么它不起作用。这段代码在其他一些主题上是可以工作的,这些主题既没有涉及Umlaut,也没有涉及URL。

如果有人知道答案,我将非常感激。

谢谢您的帮助!


2
我们无法帮助您处理我们看不到的假设问题。从根本上讲,这些字符串并不相等。如果它们相等,=== 将返回 true。所以它们不相等。您已经尝试了我建议的第一件事(确保它们都是原始值,而不是对象)。第二件事是双重检查它们的长度,并循环遍历它们,找出它们在哪个字符处不同:if (str1.length !== str2.length) { console.log("lengths are different"); for (var n = 0; n < str1.length) { if (str1[n] !== str2[n]) { console.log(n + " different: '" + str1[n] + "' !== '" + str2[n] + "'"); } } - T.J. Crowder
该死,为什么我没想到呢,突然感觉自己又成了个初学者 :D 这很奇怪。如果我比较它们的长度,它们并不相等。它被解析为 false。但是如果我打印它们的长度,它们都是 111 个字符长。不同的字符是冒号后面的空格。 - JHolub
有多种不同类型的空格符,"foo bar" !== "foo\tbar""foo bar" != "foo bar"(注意第二个字符串中有一个不间断空格)。 - T.J. Crowder
哦,我以为\t实际上是一个制表符而不是空格字符。最后两个有什么区别?因为我没有看到它们中的任何一个被打破,如何使用正则表达式捕获它们? - JHolub
1
@JHolub:我认为你误解了“空格”这个术语。制表符是其中的一个例子,其他例子包括空格、换行符、回车符、换页符、不间断空格等等…… - ruakh
显示剩余2条评论
1个回答

2
最终,在https部分之前的空格是一种不同类型的空格,而不是其他所有空格。
它不是制表符,我尝试使用不同的正则表达式符号来获取它(如\f\r等),但都没有成功。
最后有效的方法是使用replace(/\s/g, '')\s也包括制表符,但我认为可能不会出现只更改空格为制表符的主题更改。
请记住,如果在您的情况中制表符和空格需要有所区别,则此解决方案将无法起作用。

1
你可能会发现 charCodeAt 很有用;请参阅 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt 以获取文档。 - ruakh
我建议使用.replace(/\s/g, ' ')(注意替换字符串中的空格),这样"foo bar""foobar"就不会被视为相同。 - T.J. Crowder
再次强烈建议删除这个问题(和答案),因为它们对未来的其他人没有用处,太具体化了你的情况。 - T.J. Crowder
1
比较两个字符串太具体了吗?我明白我提出的问题方式可能太具体了,但我认为很多其他人也可能遇到这个问题。 - JHolub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接