在不同类型操作数之间,使用"=="来比较时,常常显得混乱和复杂。本文将试图对此进行一番分析和总结。
一、有一个操作数是布尔值
我们在浏览器中输入以下示例:
false==0;//true
false==1;//false
false==2;//false
true==0;//false
true==1;//true
true==2;//false
true==NaN;//false
false==NaN;//false
true==Infinity;//false
false==Infinity;//false
我们看到false和0、true和1是相等的,这是因为:
有一个操作数是布尔值时,另一个是数字时,会先将布尔值转换为数值,false转换为0,true转换为1。
假使我们另一个操作数不是数字而是null、undefined呢?
false==undefined;//false
true==undefined;//false
false==null;//false
true==null;//false
可以发现:true、false和null/undefined都不相等。
假设另一个是字符串:
false=='a';//false
true=='a';//false
false=='';//true
true=='';//false
true=='0';//false
false=='0';//true
布尔值和字符串的比较,仅有false和空字符串、false和’0’相等。
再看另一个操作数是对象、数组、正则、Date的情况:
false=={};//false
true=={};//false
false=={a:1};//false
true=={a:1};//false
false==[];//true
true==[];//false
false==[1,2];//false
true==[1,2];//false
false==new Date();//false
true==new Date();//false
false==new RegExp();//false
true==new RegExp();//false
false==/.jpg$/;//false
true==/.jpg$/;//false
true==function(){};//false
false==function(){};//false
我们可以发现:
在泛对象类型,即将数组、正则、Date、函数也看作对象类型的情况下,仅有false和空数组[]相等,其他都不想等。
综合以上,我们可以总结如下:
当有一个操作数是布尔值时,仅有false==’’、false==‘0’、false==[]、false0、true1几种情况返回true。
二、有一个操作数是数值
1==null;//false
0==null;//false
1==undefined;//false
0==undefined;//false
1=='';//false
0=='';//true
1=='a';//false
0=='a';//false
1=='1';//true
0=='0';//true
Infinity=='Infinity';
1=={};//false
0=={};false
1=={a:1};//false
0=={a:1};//false
1==[];//true
0==[];//false
1==[1,2];//false
0==[1,2];//false
1==new Date();//false
0==new Date();//false
1==new RegExp();//false
0==new RegExp();//false
1==function(){};//false
0==function(){};//false
总结如下:
数字和和其他类型的相等操作,仅有0==’’、0==[]、0false、1true、n==‘n’(n为数字,且n不为NaN,可以为Infinity)几种情况返回true。
三、有一个操作数是字符串
''==undefined;//false
'a'==undefined;//false
''==null;//false
'a'==null;//false
''=={};//false
'a'=={};//false
''=={a:1};//false
'a'=={a:1};//false
''==[];//true
'a'==[];//false
''==[1,2];//false
'a'==[1,2];//false
''==new Date();//false
'a'==new Date();//false
''==new RegExp();//false
'a'==new RegExp();//false
''==function(){};//false
'a'==function(){};//false
总结如下:
字符串和和其他类型的相等操作,仅有‘’0、’’[]、’’==false、‘n’==n(n为数字,且n不为NaN,可以为Infinity) 几种情况返回true。
四、有一个操作数是null、undefined
通过以上,我们已经知道null和undefined和以上类型都不相等。那么和对象、数组、正则、Function、Date呢?
null=={};//false
null=={a:1};//false
null==[];//false
null==[1,2];//false
null==new Date();//false
null==new RegExp();//false
null==function(){};//false
undefined=={};//false
undefined=={a:1};//false
undefined==[];//false
undefined==[1,2];//false
undefined==new Date();//false
undefined==new RegExp();//false
undefined==function(){};//false
总结如下:
null或者undefined和其他类型的相等操作,仅有nullundefined、undefinednull返回true。
五、有一个操作数是对象、数组、正则、函数、Date
当有一个操作数是泛对象时,另一个操作数不是泛对象时,前面的结果无须赘言,全都返回false;
当两个操作数都是泛对象,但彼此细分来类型并不相同时,如下:
{}==function(){};//false,注function(){}=={}报错
Object()==new Date();//false
Object()==[];//false
Object()==new RegExp();//false
[]=={};//false,注{}==[]报错
[]==new RegExp();//false
[]==new Date();//false
[]==function(){};//false
new RegExp()=={};//false
new RegExp()==[];//false
new RegExp()==new Date();//false
new RegExp()==function(){};//false
new Date()=={};//false
new Date()==[];//false
new Date()==new RegExp();//false
new Date()==function(){};//false
new Function()=={};//false
new Function()==[];//false
new Function()==new Date();//false
new Function()==new RegExp();//false
可以发现,全都返回false。
总结一下:
泛对象类型和其他类型的相等操作,全部返回false,某些形式的比较还会报错。
六、两个相同类型操作数的比较
无须赘言,只需看是否完全相同。需注意的是:
null==null;//true
undefined==undefined;//true
NaN==NaN;//false
Infinity==Infinity;//true
Infinity==-Infinity;//false
七、总结:
综合以上讨论,我们可以得出以下结论:
对于不同类型间的’=='比较:
(1)undefined、null相互之间的比较返回true;
(2)1和true相互之间比较返回true;
(3)‘’、[]、0、false相互之间的比较返回true;
(4)‘n’==n(n为数字,且n不为NaN,可以为Infinity) 返回true;
(5)'0’和false相互之间的比较返回true;
(5)在比较不报错的其他情况下,均返回false。
需额外注意:
‘0’和’’、‘0’==[]相互间比较返回false。
对于相同类型的比较:
只需看值是否相同,相同则返回true,例外是NaN==NaN返回false。