【问题标题】:Is it posible to two equal strings be unequal in Javascript?Javascript中两个相等的字符串是否可能不相等?
【发布时间】:2020-08-04 13:40:01
【问题描述】:

我和我的团队正在做一个 React/Redux 项目,现在我想过滤掉重复的标签,但我意识到有人像这样在标签数据中添加了一些棘手的字符串

当我将这些标签记录到控制台时,例如标签列表的第一个和第二个标签看起来相同的是“人性”,但是当我将它们与甚至严格的相等运算符进行比较时,我得到了错误的结果。

当我尝试选择并复制两个字符串标签中的文本内容,然后将它们粘贴回控制台时,我得到了一个令人惊讶的结果——第二个标签中的字符串不知何故在字符之间有空格(下图中的红点)

在请给我一些解释之前,有人必须面对这个问题。 谢谢。

【问题讨论】:

  • 实际的“棘手字符串”应直接在您的问题中发布,而不是作为图片链接。
  • 你已经发现问题了,字符串中有特殊字符。你的问题是如何清洁这些?
  • 有许多特殊的 Unicode 字符不会在屏幕上呈现为可见标记。
  • 有些字符的宽度为零,它们是“不可见的”,它们没有可见的表示,如果将它们添加到一些已经存在的字符串中,该字符串的外观不会因为可见表示而改变没有改变。

标签: javascript string equals


【解决方案1】:

直接回答您的问题:

Is it possible for to two equal strings be unequal in Javascript?

正如 cmets 中提到的,您的字符串中有一些不可见的字符,当您比较它们时会导致它们不相等。

要解决此问题,请使用您选择的方法删除不可见字符(我的建议是首先不要让用户输入不可见字符)。

【讨论】:

  • 您不能信任任何前端控件,并且应该进行后端剥离,因为前端控件仅用于 UI,如果需要可以绕过。
  • @WBT 是的,当然。我不是在建议前端解决方案。
【解决方案2】:

每个字符串的.length 属性是什么?

如果您在从 0(包括)到长度(不包括)的每个字符位置上迭代 index 变量,并打印 .charCodeAt(index),您会看到什么?

在执行此操作时,您可能会看到字符串之间的差异。

【讨论】:

  • 乍一看,当我看到那些相似的字符串时,我不敢相信这是两个不同的字符串,所以我不检查长度:(
  • @LocV'sNest 欢迎调试。好的策略包括质疑您所看到和假设的内容,并检查这些假设是否真的正确。当您找到一个不存在的错误时,这是​​修复该错误的一大进步。
【解决方案3】:

我发现这两个相似的字符串之一包含一些特殊的不可见的零宽度字符,称为 字节顺序标记 (https://www.ionos.com/digitalguide/websites/web-development/byte-order-mark/)

我们可以通过正则表达式 /[^\x20-\x7E]/g 去掉这些字符 (https://www.w3resource.com/javascript-exercises/javascript-string-exercise-32.php)

我们可以使用一些显示 unicode 字符的工具来检测不可见字符的存在 (https://qaz.wtf/u/show.cgi?show=a%E2%80%8Bc&type=string)

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2015-10-30
    相关资源
    最近更新 更多