题 JavaScript中==和===之间的区别[重复]


可能重复:
Javascript === vs ==:我使用哪个“相等”运算符是否重要? 

有什么区别 == 和 === 在JavaScript?我也见过 != 和 !== 运营商。还有更多这样的运营商吗?


1415
2018-02-07 11:53


起源


以下是JavaScript中的运算符与性能测试的详细比较 - Zaheer Ahmed
== 是 === 与类型转换(又名强制)。要真正理解我的意思,你可以看看这个行为完全一样的JavaScript函数 ==: stackoverflow.com/a/38856418/984780 - Luis Perez
除了JS中的===和!==之外,它们还应该添加+ ==和 - ==,只有在相同类型时才增加或减少。 - eoredson


答案:


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

JavaScript既严格又有   类型转换平等比较。   为了对象的严格平等   比较必须具有相同的类型和:

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

比较运算符 - MDC


1077
2018-02-07 11:55



所以,如果我这样做: if (input == null) ...,当输入未定义时,它是否也会使条件成立? - Filip Vondrášek
上面的声音听起来似乎= =比较不会检查第一个项目符号点中的所有内容,“相同位置的相同字符序列,相同长度和相同字符”,但事实上确实如此。据我所知,比较两个字符串的唯一真正区别是===, new String()===new String() 返回false(不同的对象引用)。但 new String 无论如何应该避免。 - Matt Browne
-1问题是“有什么区别?”你只解释了严格的运算符,但没有解释它们与非严格运算符之间的区别 - CodyBugstein
我没完全搞定 “如果两个对象引用相同的对象,则它们严格相等” - 什么?由两个对象,它是否意味着两个参考变量..? - T J
有关问题的简明英文说明请参阅 stackoverflow.com/a/38856418/984780 - Luis Perez


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

3个等号表示“没有类型强制的平等”。使用三等于,值也必须在类型上相等。

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

1761
2018-02-07 11:57



谢谢你的答案!我想如果与C#相比,==也将==和===将转换为.Equals() - Koen Zomers
那么“new String()=== new String()”,值和类型都是一样的。但声明返回false。 - riship89
@ hrishikeshp19:在这种情况下,值实际上是不同的(不同的对象引用) - l8nite
@KoenZomers我不认为你的C#案例是对的。实际上C#中没有等价物。 ==在C#中做一个引用比较,而Equals做预定义比较,它们中没有一个在JavaScript中具有等价物。 - Earth Engine
@ hrishikeshp19, new String() 不是字符串类型,它是对象类型,因此对象的===规则适用。但是,原始字符串的使用通常会导致强制转换为字符串 String 对象,所以区别是微妙的。如果你要分配 new String() 到两个不同的对象, s1 和 s2, valueOf() 每个方法都会为每个返回一个字符串原语 s1.valueOf() === s2.valueOf() 会回来的 true。 - danorton