JavaScript中"=="和"==="的区别

1711
在JavaScript中,“==”和“===”有什么区别?我还看到过“!=”和“!==”运算符。是否还有其他类似的运算符?

1
== 是带有类型转换(也称为强制转换)的 ===。要真正理解我的意思,您可以查看此 JavaScript 函数,该函数的行为与 == 完全相同:https://dev59.com/Z3RC5IYBdhLWcg3wROpQ#38856418 - Luis Perez
一些关于 == 的可能令人惊讶的例子。 - ToolmakerSteve
3
没错,这就是抽象相等运算符(==),也被称为“如果类型相同则严格比较,否则将null、undefined、以及document.all视为相等,但如果涉及到字符串和数字或bigint,则将字符串强制转换为对应的数值类型;如果涉及布尔型,则将其转换为数字;如果涉及对象,则将其转换为原始值;如果涉及数值类型,则使用不同的无穷大和NaN值进行比较,重复以上步骤直到比较完成”。 - Sebastian Simon
2个回答

2036

看这里:http://longgoldenears.blogspot.com/2007/09/triple-equals-in-javascript.html

三个等于号表示“不进行类型转换的相等比较”。使用三个等于号时,值的类型也必须相等。

0 == false   // true
0 === false  // false, because they are of a different type
1 == "1"     // true, automatic type conversion for value only
1 === "1"    // false, because they are of a different type
null == undefined // true
null === undefined // false
'0' == false // true
'0' === false // false

86
感谢明确的回答!我想如果与C#进行比较,"=="也应该是"==",而"==="则可以翻译为".Equals()"。 - Koen Zomers
12
对于"new String()===new String()",两个值和类型都是相同的。但是语句返回false。 - hrishikeshp19
42
在这种情况下,这些值实际上是不同的(具有不同的对象引用)。 - l8nite
21
我认为你所说的关于 C# 的情况是不正确的。实际上,在 C# 中没有等同于 JavaScript 的“==”,它是一个引用比较符号;而“Equals”则会进行预定义的比较,也与 JavaScript 没有等价项。请注意,这里没有解释和其他内容。 - Earth Engine
5
@hrishikeshp19,“new String()”并不是字符串类型,它属于对象类型,因此适用于对象的“===”规则。然而,使用原始字符串通常会导致将字符串强制转换为“String”对象,因此差异是微妙的。如果您将“new String()”分配给两个不同的对象s1s2,则每个对象上的“valueOf()”方法都将返回一个字符串原语,并且s1.valueOf() === s2.valueOf()将返回“true”。 - danorton
显示剩余13条评论

1211

===!== 是严格比较运算符:

JavaScript有严格和类型转换的相等比较。对于严格相等性, 被比较的对象必须具有相同的类型并且:

  • 当两个字符串具有相同的字符序列,相同的长度和相应位置的相同字符时,则两个字符串严格相等。
  • 当两个数字在数值上相等(具有相同的数值)时,它们是严格相等的。NaN 不等于任何东西,包括 NaN。正零和负零彼此相等。
  • 如果两个布尔操作数都为true或都为false,则它们是严格相等的。
  • 如果它们引用同一个 Object,则两个对象是严格相等的。
  • nullundefined 类型是 ==(但不是 ===)。[即 (null == undefined) 为 true,但 (null === undefined) 为 false]

比较运算符 - MDN


4
如果我这样写:if (input == null) ...,那么当 input 是 undefined 时,这个条件是否也会成立呢? - Filip Vondrášek
5
以上内容似乎暗示"=="比较不会检查第一个要点中的所有内容:"相同的字符序列、长度相同,对应位置的字符也相同",但实际上它确实会检查。据我所知,比较两个字符串唯一真正的区别是使用"==="时,new String()===new String()返回false(不同的对象引用)。不过,无论如何应该避免使用new String - Matt Browne
191
问题是“有什么区别?”,你只解释了严格运算符,但没有解释它们与非严格运算符之间的区别。 - CodyBugstein
7
“如果两个对象引用指向同一个对象,则这两个对象严格相等。”我对此不是很理解——是指两个引用变量吗? - T J
1
有关问题的普通英语描述,请参见https://dev59.com/Z3RC5IYBdhLWcg3wROpQ#38856418。 - Luis Perez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接