如果你只知道==是用来比较值是否相等,而===是比较 值+类型 是否相等,那么你接来下可能会大吃一惊的。
1.==是没有传递性的。何为传递性,就是如果a==b,b==c,那么a==c。但是在javascript里面,这未必成立。
var a=[1];
var b=[1];
a==1;//true
b==1;//true
a==b;//false
2.当两个比较的数据是引用类型的,==并不会转换其数据类型,不管他们是否为同一数据类型。这时比较的是两个对象是否为同一对象,类似c中的内存地址。期间不会调用对象的valueOf方法。这也解释了上面的现象。
var a=[1];
var b=[1];
a.valueOf=function(){
alert('a valueOf');
return 1;
}
a==b;//false,也不会执行a.valueOf方法
3.如果有一个基础类型数据和引用类型数据,那么这里会调用对象的valueOf方法,并会发生数据类型转换(或者说忽略数据类型)
var a=[1];
a.valueOf=function(){
alert('a valueOf');
return 1;
}
a=='1';//true,执行a.valueOf方法
4.===具有传递性。两个数据都是引用类型,这个用法与 == 一样,如果不是同一个对象,比较结果都是false。
var a=[1];
var b=[1];
a==b;//false
a===b;//false
5.用===比较两个基础类型的值,会验证值类型。
1==='1';//false
总结:
一.如果用==和===比较的两个数据都是引用类型,只有在两个变量引用同一个对象时,结果才会为真,否则为假。
二.如果只有一个引用类型数据,那么用==比较时,对象会调用valueOf方法;而===比较时,不会调用valueOf方法。