【问题标题】:What is the correct way to check for string equality in JavaScript?在 JavaScript 中检查字符串是否相等的正确方法是什么?
【发布时间】:2022-08-07 16:17:03
【问题描述】:

在 JavaScript 中检查字符串是否相等的正确方法是什么?

  • 有理由不使用 == 吗?
  • @Kendrick——当然。它的类型强制系统可能非常不直观,并且很容易忽略错误(它看起来对,但可能非常错误)
  • @Kendrick - 例如,因为 {} == \"[object Object]\" 的计算结果为真。
  • String().equals() 不是 JS 中的方法有点烦人...
  • @AlexanderMills 为什么?

标签: javascript string string-comparison


【解决方案1】:

总是在您完全理解使用 ===== 运算符的区别和含义之前,请使用 === 运算符,因为它可以帮助您避免晦涩(非显而易见)的错误和 WTF。由于内部类型强制,“常规”== 运算符可能会产生非常意外的结果,因此始终推荐使用 ===

为了深入了解这一点,以及 Javascript 的其他“好与坏”部分,请阅读 Douglas Crockford 先生和他的工作。有一个很棒的 Google 技术讲座,他总结了很多有用的信息:http://www.youtube.com/watch?v=hQVTIJBZook


更新:

Kyle Simpson 的You Don't Know JS 系列非常棒(可免费在线阅读)。该系列进入了该语言中通常被误解的领域,并解释了 Crockford 建议您避免的“坏部分”。通过了解它们,您可以正确使用它们并避免陷阱。

Up & Going”一书包括关于Equality 的部分,其中具体总结了何时使用松散 (==) 与严格 (===) 运算符:

将大量细节归结为几个简单的要点,并帮助您了解在各种情况下是使用==还是===,以下是我的简单规则:

  • 如果比较中的任一值(也称为边)可能是truefalse 值,请避免使用== 并使用===
  • 如果比较中的任一值可能是这些特定值(0""[] -- 空数组),请避免使用 == 并使用 ===
  • 全部其他情况下,您可以安全地使用==。它不仅安全,而且在许多情况下,它以提高可读性的方式简化了您的代码。

对于不想花时间真正理解 Javascript 的开发人员,我仍然推荐 Crockford 的演讲——对于偶尔使用 Javascript 的开发人员来说,这是一个很好的建议。

【讨论】:

  • 当您确定两个操作数都是字符串时,就没有必要了,例如,使用 if (typeof foo == "string")
  • @Marcel - 你是对的,但最好总是使用=== 运算符,永远不必担心“我真的,完全,100% 确定== 会按照我的想法行事吗?”
  • @STW – Crockford 不是 JavaScript 的 alpha 和 omega 的一个例子是,他建议不要使用一元递增/递减 (++/--)。
  • 并且永远不要使用++-- 或单行if/else 语句或continuenew 运算符或任何其他数量的完全合法的代码实践,Crockford 认为是“有害的”。当然从来没有曾经甚至考虑考虑使用evalwith,即使它们的陷阱已被充分理解。你见过 JS 的下一个版本吗?更严格的语法和少量的辅助函数,其中一些已经流传了多年,这就是我们在这段时间里得到的一切。语法根本没有发展。如果克罗克福德是这件事的幕后黑手,那将是一件坏事。
  • @CoffeeAddict - JSFiddle 中的快速测试似乎不同意。它们都区分大小写:jsfiddle.net/st2EU
【解决方案2】:

如果您知道它们是字符串,则无需检查类型。

"a" == "b"

但是,请注意字符串对象不会相等。

new String("a") == new String("a")

将返回假。

调用 valueOf() 方法将其转换为 String 对象的原语,

new String("a").valueOf() == new String("a").valueOf()

将返回真

【讨论】:

  • 感谢 JSS,两个字符串对象永远不会相等,除非它们是同一个对象,而不管值如何。
  • @JSS:此外,new String("a") == "a" 为真(但不会与=== 一起使用),因为左侧将被转换为原始字符串值。
  • @JSS:new String("a") == new String("a")new String("a") === new String("b")new String("a") === new String("a") 都将返回 false,因为您正在处理对 String 类的对象的引用,而不是 string 类型的原语。
  • 只是为了向任何阅读它的人澄清这一点。 new String(foo) 创建一个字符串目的String(foo)转换foo 到一个字符串原语。
  • @FakeRainBrigand - 像泥巴一样清晰,但这就是 javascripts 的意义所在,不是吗?
【解决方案3】:

只是对答案的一个补充:如果所有这些方法都返回 false,即使字符串看起来相等,也可能在一个字符串的左侧和或右侧有一个空格。因此,只需在比较之前在字符串末尾添加一个.trim()

if(s1.trim() === s2.trim())
{
    // your code
}

我已经浪费了几个小时试图找出问题所在。 希望这对某人有帮助!

【讨论】:

  • 非常感谢。不过这对我来说很奇怪,因为我确保左边或右边没有空格,但这仍然是解决我的问题的唯一方法。也许它与字符串的内部表示有关?
  • 谢谢@akelec!! @Niko,这可能是由于肉眼看不见的零宽度空间字符。见en.wikipedia.org/wiki/Zero-width_space。尽管这个角色有它的用途,但许多开发者都讨厌它的存在!
  • 谢谢你,因为我的 if 中的相等检查失败但我在调试时检查时没有看到空格,这很令人沮丧。
  • 从文本文件加载变量时的一个常见问题(即:使用fetch)。非常感谢。
  • 这是最好的答案。
【解决方案4】:

您可以使用=====,但最后一个以更简单的方式工作(src

a == b(及其否定!=)

a === b(及其否定!==)

【讨论】:

  • 至少'=='是对称的... |-=)
  • @Lars 不完全是:if("0"==0 && 0==[]) console.log("0"==[]);
  • I ment if a==b then b==a for all a and b
  • @Lars 它像你说的那样是对称的,但是......它是 JS :P
【解决方案5】:

导致我提出这个问题的是paddingwhite-spaces

检查我的情况

 if (title === "LastName")
      doSomething();

标题是" LastName"

所以也许你必须像这样使用trim 函数

var title = $(this).text().trim();

【讨论】:

  • 谢谢同样在这里我在打字稿中使用.toString().trim()
【解决方案6】:

实际上有两种方法可以在 javascript 中创建字符串。

  1. var str = 'Javascript'; 这会创建一个原始字符串值。

  2. var obj = new String('Javascript'); 这会创建一个包装对象 String 类型。

    typeof str // string
    typeof obj // object

    因此,检查相等性的最佳方法是使用 === 运算符,因为它会检查两个操作数的值和类型。

    如果您想检查两个对象之间的相等性,那么使用 String.prototype.valueOf 是正确的方法。

    new String('javascript').valueOf() == new String('javascript').valueOf()
    

【讨论】:

    【解决方案7】:

    可以使用 JSON.stringify() 技巧检查字符串 Objects

    var me = new String("me");
    var you = new String("me");
    var isEquel = JSON.stringify(me) === JSON.stringify(you);
    console.log(isEquel);

    【讨论】:

    • 你在开玩笑吧?你的意思是 iSequel 吗?) 开个玩笑……
    【解决方案8】:

    严格比较

    要进行简单比较,请使用===检查严格相等。正如其他人所说,这具有最高效和减少错误或不确定代码的机会的优点。来源:MDN Web Docs: Strict Equality

    var a = "hello1";
    var b = "hello2";
    console.log("a === a?" + (a === a) + "|");
    console.log("a === b?" + (a === b) + "|");

    字母比较

    如果要比较两个字符串以了解一个字符串是在另一个字符串之前还是之后,基于自然排序,请使用<><=>= 运算符。来源:<><=>= 的 MDN WebDocs。

        var a = "hello1";
        var b = "hello2";
        console.log("a < a?" + (a < a) + "|");
        console.log("a < b?" + (a < b) + "|");
        console.log("a > b?" + (a > b) + "|");
        console.log("b > a?" + (b > a) + "|");

    【讨论】:

      【解决方案9】:

      考虑到两个字符串可能都很大,主要有两种方法bitwise searchlocaleCompare

      我推荐这个功能

      function compareLargeStrings(a,b){
          if (a.length !== b.length) {
               return false;
          }
          return a.localeCompare(b) === 0;
      }
      

      【讨论】:

        【解决方案10】:

        还要考虑["foo", "bar"] == "foo,bar"

        【讨论】:

          【解决方案11】:

          对于字符串,我们有一个支持的方法localCompare,它在字符串比较中非常方便。 IMO,我们应该只使用它,不需要使事情复杂化。

          用法:

          const a = 'Hello'
          const b = 'Hell'
          
          a.localCompare(a) // 0
          a.localCompare(b) // 1
          b.localCompare(a) // -1
          

          【讨论】:

            猜你喜欢
            • 2018-09-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-14
            • 1970-01-01
            • 1970-01-01
            • 2013-07-06
            相关资源
            最近更新 更多