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


841

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


2
有没有不使用==的理由吗?
肯德里克

21
@Kendrick-当然 它的类型强制系统可能非常难以理解,并且可以使错误很容易被忽略(它看起来不错,但是可能非常错误)
STW 2010年

20
@Kendrick- {} == "[object Object]"例如,因为评估为true。
Chetan Sastry,2010年

12
有点烦人,这String().equals()不是JS中的方法...
Alexander Mills

2
@AlexanderMills为什么?
Ry-

Answers:


623

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

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


更新:

凯尔·辛普森(Kyle Simpson)撰写的您不知道JS”系列非常出色(可在线免费阅读)。该系列文章深入介绍了该语言中经常被误解的部分,并解释了克罗克福德建议您避免的“不良部分”。通过了解它们,您可以正确使用它们并避免陷阱。

在“ 调试与展望 ”一书包括上一节平等,用时使用宽松(这个特定的总结==)与严格的(===)运算符:

要将大量细节归结为一些简单的要点,并帮助您知道是使用==还是===在各种情况下使用,这是我的简单规则:

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

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


7
当您确定两个操作数都是字符串时,例如,使用if (typeof foo == "string")
Marcel Korpel,2010年

25
@Marcel-您是正确的,但始终使用===运算符而不用担心“我真的是完全可以完全==按照我的想法行事吗?100%更好”。
STW 2010年

7
@STW –为什么Crockford不是JavaScript的alpha和omega的一个示例是他的建议不要使用一元增减(++/ --)。
Marcel Korpel 2010年

10
而从不使用++--或单行if/else陈述或continuenew经营者或其他任何数量的完全合法的代码实践,克罗克福德已被视为“有害”。当然甚至永远也不要考虑使用它,eval或者with即使他们的陷阱很容易理解。您看过下一版JS吗?这段时间里,我们得到的几乎是更严格的语法和少数辅助功能,其中一些已经浮动了很多年。语法根本没有发展。如果克罗克福德(Crockford)支持,那将是一件坏事。
MooGoo 2010年

4
@CoffeeAddict-在JSFiddle中进行的快速测试似乎不同意。它们都区分大小写:jsfiddle.net/st2EU
STW

203

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

"a" == "b"

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

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

将返回false。

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

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

将返回true


4
感谢使用JSS,两个字符串对象永远不会相等,除非它们是相同的对象,而不管其值如何。
阿努拉格

4
@JSS:此外,它new String("a") == "a"为true(但不会与在一起===),因为左侧将被转换为原始字符串值。
马修·克鲁姆利

5
@JSS: ,,new String("a") == new String("a") 将全部回报,因为你和引用处理的对象类,类型不是基本类型。new String("a") === new String("b")new String("a") === new String("a")falseStringstring
palswim

4
只是为了向所有阅读它的人澄清一下。 new String(foo)创建一个字符串对象String(foo) 并将 foo 转换为字符串基元。
Brigand

9
@FakeRainBrigand-像泥一样清澈,但这就是javascript的意思,不是吗?
Periata Breatta

58

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

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

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


1
非常感谢。但是,这对我来说很奇怪,因为我确保左右没有空格,但这仍然是解决问题的唯一方法。也许与字符串的内部表示有关?
Niko

2
谢谢@akelec!@Niko,这很可能是由于肉眼看不见的零宽度空格字符。参见en.wikipedia.org/wiki/Zero-width_space。尽管此字符具有其用途,但许多开发人员仍对它的存在感到愤慨!
stwr667 '18

谢谢您,这令人沮丧,因为如果我的相等检查失败了,但是在调试时进行检查时我没有看到空格。
drzounds

从文本文件加载变量时的一个常见问题(即:使用fetch)。非常感谢。
Sopalajo de Arrierez,

@SopalajodeArrierez,确切地说,字符串的末尾大部分是空格或回车符。别客气。
akelec '19

22

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

检查我的情况

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

标题是 " LastName"

在此处输入图片说明

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

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

2
谢谢我.toString().trim()在打字稿中使用的相同 内容
Akitha_MJ,

17

除非您真的知道强制是如何工作的,否则应避免==使用标识运算符,===而应使用它。但是您应该阅读此书以了解其工作原理

如果使用==,则可以让语言为您执行某种类型的强制转换,例如:

"1" == 1 // true
"0" == false // true
[] == false // true

正如道格拉斯·克罗克福德(Douglas Crockford)在他的书中所说:

始终最好使用身份运算符。


3
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
Parkash Kumar 2015年

{}==" "给我Unexpected token ==什么是正确的方法?
Basheer AL-MOMANI

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()

6

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

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


1

考虑到这两个字符串可能是非常大的,有2种主要的方法bitwise searchlocaleCompare

我推荐这个功能

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

-2

最简单的方法是使用三元运算符,如下所示:

 "was" == "was" ? true : false

但是,如果要比较的字符串在数组中,则将使用es6过滤器

let stringArray  = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ? 
stringArray.pop(indexOf(I)) : null)

上面将检查您的stringArray以及从数组中匹配它的任何字符串,在本例中,我们选择了“ boys”


-8

我在测试期间想出了一个替代解决方案。您可以在字符串原型上使用function。

String.prototype.betwenStr = function(one){

return JSON.stringify(new String(this)) === JSON.stringify(new String(one));

}


 //call it
 "hello world".betweenStr("hello world"); //returns boolean 
 //value

在chrome浏览器中正常工作


该问题询问如何检查“ hello world” =“ hello world”,而不是如何检查“ hello world”是否为字符串。
尼克,

4
这真是愚蠢。您已创建的Rube Goldberg版本==
JJJ

嗨,OP,您的编辑在精神层面上是完全不同的,并且您的答案已经被否决了。我劝你请删除这个答案,并发布一个新的与你的编辑版本
耶尔马兹杜尔马兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.