概要
在JavaScript中,==和===运算符一直是一个令人头疼的问题。==用来判断等式两边的值是否宽松相等。===用来判断等式两边的值是否严格相等。
本文对这两种运算符的判断规则做出了详细解析与总结。
一、=== 严格相等
严格相等的运算规则很简单。=== 运算符在比较时不进行类型转换。只有在两个值的类型和内容都完全相同时,它才会返回 true。
例如:
5 === '5'; // false,因为类型不同
null === undefined; // false,因为它们的类型不同
0 === false; // false,因为类型不同
5 === 6; //false,类型相同,值不同
5 === 5; //true,类型相同,值相同
在进行===判断时,有两种特殊情况需要注意:
1、等式两边中有任意一端存在NaN,返回false。
2、判断-0 === +0时,返回false。
二、== 宽松相等
宽松相等的运算规则就复杂不少了,== 运算符会进行类型转换。
在此之前,要介绍js中的八种数据类型:
原始类型-String、Number、Boolean、Null、Undefined、Symbol、BigInt
对象类型-Object(Object是个大类,function函数、array数组、date日期…等都归属于Object)
在进行 == 比较时,根据等式两边的类型情况,运算规则如下(比较顺序从上往下依次判断):
(1)两端类型相同,比较值。
(2)两端中有任意一端存在NaN,返回false。
(3)undefined和null只有与自身比较,或者相互比较时,才返回true。其他情况里等式两端出现了undefined和null则返回false。
(4)两端都是原始类型,全部转换成数字比较。
(5)有一端是原始类型,有一端是对象类型。把对象转换成原始类型后,重回(1)向下比较。
例如:
5 == '5';
// true
//先看(1),类型不同;看(2),没有NaN;看(3),不涉及undefined和null;看(4),两端都是原始,转成数字比较完成。
null == undefined;
// true
//先看(1),类型不同;看(2),没有NaN;看(3),比较完成。
0 == false;
// true
//先看(1),类型不同;看(2),没有NaN;看(3),不涉及undefined和null;看(4),两端都是原始,转成数字比较完成。
const a = {};
const b = {};
a == b
// false
//先看(1),类型相同,比较值。对象的值就是地址,地址不一样所以false。
对于第(5)步,对象是怎么转换成原始类型的呢?
规则如下(从上到下依次比较):
1、如果对象拥有[Symbol.toPrimitive]方法,调用该方法,没有该方法则进入下一步。调用该方法时,若该方法得到原始值则返回,反之则抛出异常。
2、调用对象的valueOf方法。若该方法得到原始值则返回,反之则进入下一步。
3、调用对象的toString方法,若该方法得到原始值则返回,反之则则抛出异常。