概览
==和===都是JavaScript中的关系表达式运算符,与对应的还有!=和!==。
==和===运算符主要用于比较两个值是否相等。当然它们对相等的定义不尽相同。两个运算符允许任意类型的操作数,如果操作数相等则返回true,否则返回false。
==和===虽然都是关系表达式运算符,但它们的定义是有所不同的:
- ==:称作相等运算符(Equality Operator),它用来检测两个操作是否相等,这里的相等的定义非常宽松,可以允许类型的转换
- ===:称作严格相等运算符(Strict Equality),也被称之为恒等运算符(Identity Operator)或全等运算符,它用来检测两个操作数是否严格相等,不进行类型转换
==和 !=
这两个操作符被称为相等和不相等,会先转换操作数的类型,然后再比较它们的相等性。
在数据类型转换时遵循下列基本规则:
- 如果两个操作数的类型相同,则会按照严格相等的比较规则一样
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false为0,true为1
- 如果有一个操作数为字符串,另一个操作数为数值,则比较之前先将字符串转换成数值
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf方法,用得到的基本类型值按前面的规则进行比较。
发现一个规律就是基本都是其他类型向Number类型转换
关于Number类型转换的规则可以参考 js学习笔记:数据类型——Number
在比较时遵循下列规则:
- 比较相等性之前,不能将null和undefined转换成其他任何值
- null和undefined是相等的
- NaN不等于任何其他值,包括它自己。
- 如果两个操作数都是对象,则比较他们是不是同一对象,如果两个操作数指向同一个对象则返回true,否则返回false
先来看一些对象的比较:
var a = [1,2,3];
var b = [1,2,3];
a==b; //false
var c = {x:1,y:2};
var d = {x:1,y:2};
c==d; //false
var e = "text";
var f = "te"+"xt";
e==f; //true
看一些相等比较的例子:
NaN != NaN //true
true == 2 //false
undefined == 0 //false
null == 0 //false
"5" == 5 //true
===和 !==
在比较前不转换操作数,因此只有类型相同的操作数才会继续比较具体值。
其在比较时遵循的规则如下:
- 如果两个值类型不相同,则它们不相等
- NaN和其他任何值都是不相等的,包括它本身
- 如果两个引用值指向同一个对象,数组或函数,则它们是相等的。如果指向不同的对象,则它们是不等的,尽管两个对象具有完全一样的属性。