在js中相等比较运算符的处理情况是比较复杂的,总结大致有如下四条规则:
1、如果等号两侧为undefined和null,那么表达式返回true;
console.log(null==undefined); //true
复制代码
2、如果等号两侧为原始类型(Number,String,Boolean),那么默认转换成数字再进行比较,如果等号两侧数据类型相同那么就相当于全等
console.log(1=='1'); //true(相当于1和1的比较)
console.log(1=='true'); //false(相当于1和NaN的比较)
console.log(1==true); //true(相当于1和1的比较)
console.log('true'==true); //false(相当于NaN和1的比较)
复制代码
3、如果是引用类型的比较,先使用valueOf方法获取他的原始值,如果原始值为原始类型的话按照规则而再做处理,否则直接比较他们的引用
1、
var obj1={
a:1
}
var obj2={
a:1
}
console.log(obj1==obj2);//false(先用valueOf获取他们的值{a:1},发现不是原始类型,那么就要进行引用的比较,隐藏返回false)
2、
var a=1;
var b=new Number(1);
console.log(a==b);//true (右边通过对象的valueOf方法获得了他的原始值1,再进行比较)
复制代码
4、如果不符合上述三条规则,js的解释器默认都返回false,如下:
console.log(0==null); //false
console.log(0==undefined); //false
console.log(false==null); //false
console.log(false==undefined); //false
复制代码