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

JSS*_*JSS 793 javascript string

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

STW*_*STW 596

始终直到您完全理解使用=====运算符的差异和含义,使用运算符,===因为它将使您免于模糊(非明显)的错误和WTF.==由于内部的类型强制,"常规"运算符可能会产生非常意外的结果,因此使用===始终是推荐的方法.

为了深入了解这一点,以及Javascript的其他"好与坏"部分,请阅读Douglas Crockford先生及其作品.有一个很棒的Google Tech Talk,他总结了很多好的信息:http://www.youtube.com/watch?v = hQVTIJBZook


更新:

凯尔辛普森的" 你不知道的JS系列"非常出色(可以免费在线阅读).该系列进入了语言中常被误解的领域,并解释了克罗克福德建议你避免的"坏部分".通过了解它们,您可以正确使用它们并避免陷阱.

" Up&Going "一书包含有关Equality的部分,以及何时使用loose(==)vs strict(===)运算符的具体摘要:

要将一大堆细节归结为几个简单的小贴士,并帮助您了解是否使用=====在各种情况下,这是我的简单规则:

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

对于那些不想花时间真正理解Javascript的开发人员,我仍然推荐Crockford的演讲 - 这对于偶尔在Javascript中工作的开发人员来说是个好建议.

  • @Marcel - 你是对的,但总是*总是*使用`===`运算符并且永远不必担心"我真的,完全,100%确定`==`会表现如何我想会吗?" (21认同)
  • 永远不要使用`++`或`--`或单行`if/else`语句或`continue`或`new`运算符或任何其他数量的Crockford认为"有害"的完全合法的代码实践.当然,从来没有*甚至考虑过使用`eval`或`with`,即使他们的陷阱已被充分理解.你看过JS的下一个版本了吗?更严格的语法和一些辅助函数,其中一些已经浮出多年,是我们所有这一切都得到的.语法根本没有进化.如果克罗克福德支持这一点,那么这是一件坏事. (9认同)
  • 当你确定两个操作数都是字符串时,例如,当使用`if(typeof foo =="string")时,没有必要这样做. (7认同)
  • @STW - 为什么Crockford不是JavaScript的alpha和omega的一个例子,他的建议是不使用一元递增/递减(`++` /`--`). (6认同)
  • @CoffeeAddict - JSFiddle的快速测试似乎不同意.它们都区分大小写:http://jsfiddle.net/st2EU/ (4认同)
  • @amn 许多现代约定实际上建议开发人员坚持严格相等运算符 `===`(例如 [ESLint 的 `eqeqeq` 规则](https://eslint.org/docs/rules/eqeqeq))。在我看来,`==` 在实际比较之前进行隐式转换的行为会让人们感到不安。当来自不同的语言时,`==` 只熟悉语法,不熟悉语义。然而,这似乎只是另一种观点,你在这里的措辞过于强烈,只是为了发表观点。 (2认同)

Anu*_*rag 193

如果您知道它们是字符串,那么就不需要检查类型.

"a" == "b"
Run Code Online (Sandbox Code Playgroud)

但请注意,字符串对象不相等.

new String("a") == new String("a")
Run Code Online (Sandbox Code Playgroud)

将返回false.

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

new String("a").valueOf() == new String("a").valueOf()
Run Code Online (Sandbox Code Playgroud)

将返回真实

  • @FakeRainBrigand - 清楚如泥,但这就是javascripts,不是吗? (8认同)
  • @JSS:`new String("a")== new String("a")`,`new String("a")=== new String("b")`,`new String("a") === new String("a")`将全部返回`false`,因为你正在处理对`String`类的对象的引用,而不是`string`类型的原语. (5认同)
  • 感谢JSS,两个字符串对象永远不会相等,除非它们是同一个对象,无论值如何. (4认同)
  • @JSS:另外,`new String("a")=="a"`是真的(但不会与`===`),因为左侧将被转换为原始字符串值. (4认同)
  • 只是为了阅读它的人澄清这一点.`new String(foo)`创建一个字符串*object*,`String(foo)`*将*foo转换为字符串原语. (4认同)

ake*_*lec 51

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

if(s1.trim() === s2.trim())
{
    // your code
}
Run Code Online (Sandbox Code Playgroud)

我花了很多时间试图找出问题所在.希望这会对某人有所帮助!

  • 谢谢@akelec!!@Niko,这可能是由于肉眼不可见的零宽度空间字符。请参阅 https://en.wikipedia.org/wiki/Zero-width_space。尽管这个角色有它的用途,但许多开发者对它的存在感到不满! (2认同)

Kam*_*ski 47

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

a == b(及其否定!=

在此处输入图片说明

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

在此处输入图片说明

  • 好吧,至少 '==' 是对称的... |-=) (6认同)
  • 创作者在决定 == 规格时正在玩扫雷游戏。 (4认同)

Bas*_*ANI 20

是什么导致我这个问题是paddingwhite-spaces

检查我的情况

 if (title === "LastName")
      doSomething();
Run Code Online (Sandbox Code Playgroud)

和头衔是 " LastName"

在此输入图像描述

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

var title = $(this).text().trim();
Run Code Online (Sandbox Code Playgroud)

  • 同样感谢我在打字稿中使用`.toString()。trim()` (2认同)

小智 15

除非你真的知道强制是如何工作的,否则你应该避免==使用身份运算符===.但是你应该阅读它以了解它是如何工作的.

如果你使用==,你让语言为你做一些类型强制,例如:

"1" == 1 // true
"0" == false // true
[] == false // true
Run Code Online (Sandbox Code Playgroud)

道格拉斯·克罗克福德在他的书中说:

总是更好地使用身份运算符.

  • 虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接.如果链接的页面发生更改,则仅链接的答案可能会无效. (2认同)

Abh*_*hek 12

实际上有两种方法可以在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()
Run Code Online (Sandbox Code Playgroud)


Muh*_*man 5

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

var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
Run Code Online (Sandbox Code Playgroud)