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

IT技术 javascript string string-comparison
2021-01-16 23:13:14

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

6个回答

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

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


更新:

凯尔·辛普森 (Kyle Simpson) 的你不知道的 JS”系列非常棒(可免费在线阅读)。该系列深入探讨了语言中普遍被误解的领域,并解释了 Crockford 建议您避免的“坏部分”。通过了解它们,您可以正确使用它们并避免陷阱。

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

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

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

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

当您确定两个操作数都是字符串时,则没有必要,例如,当使用 if (typeof foo == "string")
2021-03-12 23:13:14
@Marcel——你是对的,但最好总是使用===操作符,而不必担心“我真的,完全,100% 确定它的==行为会像我认为的那样吗?”
2021-03-12 23:13:14
@CoffeeAddict——JSFiddle 中的快速测试似乎不同意。它们都区分大小写:jsfiddle.net/st2EU
2021-03-13 23:13:14
并且永远不要使用++--或单行if/else语句或continuenew运算符或任何其他数量的 Crockford 认为“有害”的完全合法的代码实践。当然还有从来没有,甚至考虑考虑使用eval或者with即使他们的缺陷是很好理解的。你看过下一个版本的 JS 吗?更严格的语法和一些辅助函数,其中一些已经存在多年,这就是我们在这段时间里得到的全部内容。语法根本没有进化。如果克罗克福德是幕后黑手,那就是一件坏事。
2021-03-29 23:13:14
@STW – 为什么 Crockford 不是 JavaScript 的 alpha 和 omega 的一个例子是他的建议,不要使用一元递增/递减(++/ --)。
2021-04-03 23:13:14

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

"a" == "b"

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

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

将返回假。

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

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

会返回真

只是为了向任何阅读它的人澄清这一点。 new String(foo)创建一个字符串对象String(foo) 并将foo转换为字符串原语。
2021-03-19 23:13:14
@FakeRainBrigand - 像泥一样清晰,但这就是 javascripts 的内容,不是吗?
2021-03-21 23:13:14
感谢 JSS,两个字符串对象永远不会相等,除非它们是同一个对象,无论值如何。
2021-03-27 23:13:14
@JSS:此外,new String("a") == "a"为真(但不会与===),因为左侧将转换为原始字符串值。
2021-04-03 23:13:14
@JSS: new String("a") == new String("a"), new String("a") === new String("b"),new String("a") === new String("a")都将返回false,因为您正在处理对String对象的引用,而不是类型的基元string
2021-04-08 23:13:14

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

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

我花了几个小时试图弄清楚出了什么问题。希望这会对某人有所帮助!

从文本文件加载变量时的常见问题(即:使用fetch)。非常感谢。
2021-03-11 23:13:14
非常感谢。不过,这对我来说很奇怪,因为我确保左侧或右侧没有空格,但这仍然是解决我的问题的唯一方法。也许它与字符串的内部表示有关?
2021-03-17 23:13:14
@SopalajodeArrierez,确切地说,字符串末尾主要有空格或回车符。不客气。
2021-03-31 23:13:14
谢谢@akelec!!@Niko,这可能是由于肉眼不可见的零宽度空间字符。参见en.wikipedia.org/wiki/Zero-width_space尽管这个角色有它的用途,但许多开发者对它的存在感到不满!
2021-04-01 23:13:14
谢谢你这令人沮丧,因为我的 if 中的平等检查失败了,但我在调试时检查时没有看到空格。
2021-04-06 23:13:14

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

a == b(及其否定!=

在此处输入图片说明

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

在此处输入图片说明

我 ment 如果 a==b 然后 b==a 对所有 a 和 b
2021-03-17 23:13:14
好吧,至少 '==' 是对称的 ... |-=)
2021-04-04 23:13:14
@Lars 它像你说的那样对称,但是......它是 JS :P
2021-04-06 23:13:14
@Lars 不完全是: if("0"==0 && 0==[]) console.log("0"==[]);
2021-04-09 23:13:14

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

检查我的情况

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

和标题是 " LastName"

在此处输入图片说明

所以也许你必须使用这样的trim功能

var title = $(this).text().trim();
谢谢,我.toString().trim()在typescript中使用
2021-03-15 23:13:14