相等操作符

​ 判断两个变量是否相等是编程中最重要的操作之一。在比较字符串、数值和布尔值是否相等时,过程都很直观。但是在比较两个对象是否相等时,情形就比较复杂了。ECMAScript 中的相等和不相等操作符,原本在比较之前会执行类型转换,但很快就有人质疑这种转换是否应该发生。最终,ECMAScript提供了两组操作符。第一组是等于和不等于,它们在比较之前执行转换。第二组是全等和不全等,它们在比较之前不执行转换

等于和不等于

​ ECMAScript 中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回 true。不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回 true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。

​ 在转换操作数的类型时,相等和不相等操作符遵循如下规则。

	- 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false 转换为 0,true 转换为 1。
	- 如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
	- 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较。

​ 在进行比较时,这两个操作符会遵循如下规则。

  • null 和 undefined 相等。
  • null 和 undefined 不能转换为其他类型的值再进行比较。
  • 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。记住:即使两个操作数都是 NaN,相等操作符也返回 false,因为按照规则,NaN 不等于 NaN。
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true。否则,两者不相等。

​ 下表总结了一些特殊情况及比较的结果。

表达式结果
null == undefinedtrue
”NaN” == NaNfalse
5 == NaNfalse
NaN == NaNfalse
NaN != NaNtrue
false == 0true
true == 1true
true == 2false
undefined == 0false
null == 0false
”5” == 5true

全等和不全等

​ 全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。全等操作符由 3 个等于号(===)表示,只有两个操作数在不转换的前提下相等才返回 true,比如:

let result1 = ("55" == 55);    //true,转换后相等
let result2 = ("55" === 55);   //false,不相等,因为数据类型不同

​ 在这个例子中,第一个比较使用相等操作符,比较的是字符串”55”和数值 55。如前所述,因为字符串”55”会被转换为数值 55,然后再与数值 55 进行比较,所以返回 true。第二个比较使用全等操作符,因为没有转换,字符串和数值当然不能相等,所以返回 false。

​ 不全等操作符用一个叹号和两个等于号(!==)表示,只有两个操作数在不转换的前提下不相等才 返回 true。比如:

let result1 = ("55" != 55); // false,转换后相等
let result2 = ("55" !== 55); // true,不相等,因为数据类型不同

​ 这一次,第一个比较使用不相等操作符,它会把字符串”55”转换为数值 55,跟第二个操作数相等。 既然转换后两个值相等,那就返回 false。第二个比较使用不全等操作符。这时候可以这么问:“字符 串 55 和数值 55 有区别吗?”答案是“有”(true)。

​ 另外,虽然 null == undefined 是 true(因为这两个值类似),但 null === undefined 是 false,因为它们不是相同的数据类型。

注意 由于相等和不相等操作符存在类型转换问题,因此推荐使用全等和不全等操作符。 这样有助于在代码中保持数据类型的完整性