不同类型间使用相等操作符"=="的比较结果

在不同类型操作数之间,使用"=="来比较时,常常显得混乱和复杂。本文将试图对此进行一番分析和总结。

一、有一个操作数是布尔值

我们在浏览器中输入以下示例:

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值