看起来相同的字符串不相等

Strings that look the same aren't equal

提问人:TSR 提问时间:4/12/2021 最后编辑:ggorlenTSR 更新时间:4/12/2021 访问量:481

问:

某些单元测试失败。调试后,我在这里跟踪了问题

var a = "USD 1,234.12"
var b = "USD 1,234.12"
console.log(a === b)

字符串由货币格式化程序库生成,字符串由单元测试开发人员编写。ab

我不明白为什么这两个看起来相同的字符串不被认为是相等的。这是怎么回事?===

enter image description here

JavaScript 字符串 相等

评论

1赞 Sebastian Simon 4/12/2021
只有当两个字符串具有相同数量的代码单元时,它们才相等,并且对于每个索引,一个字符串的代码单元与另一个字符串的代码单元匹配。此处缺少此级别的调试。你可以做到.你可以做,或者其他一些方法Array.from(a).findIndex((char, index) => char !== b[index])Array.from(a).forEach((char, index) => console.log("a", char, char.codePointAt(), "vs. b", b[index], b[index].codePointAt()))
3赞 Evert 4/12/2021
糟糕的关闭原因。它非常可重复(单击运行片段按钮),很有趣(如果您不知道不同类型的空间),并且有一个明确的答案。
0赞 Mister Jojo 4/12/2021
@Evert这也是调试过程的一半,但更好的问题应该是“如何在不考虑字符串中不同类型的空格的情况下进行相等性测试”
0赞 TSR 4/12/2021
@Evert实际上,在理解了问题之后,如何回答这个“如何在不考虑字符串中不同类型的空格的情况下进行相等性测试”
1赞 ggorlen 4/12/2021
@TSR 如果是这种情况,请编辑帖子以说明这一点。这个问题以前以各种形式被问过,但我没有看到明显的欺骗目标,这看起来像是最干净的复制品,所以我建议它是规范的。点赞。

答:

10赞 Evert 4/12/2021 #1

你的两个字符串有一个隐藏的区别。运行以下命令:

var a = "USD 1,234.12"
var b = "USD 1,234.12"

for (var i = 0; i < a.length; i++) {
  console.log(a.codePointAt(i), b.codePointAt(i));
}

字符串中的空格是常规空格 (32),而字符串中的空格是 Unicode 不间断空格 (160)。ba