不同类型间使用相等操作符"=="的比较结果
2018-03-08 16:37
281 查看
在不同类型操作数之间,使用”==”来比较时,常常显得混乱和复杂。本文将试图对此进行一番分析和总结。
我们看到false和0、true和1是相等的,这是因为:
有一个操作数是布尔值时,另一个是数字时,会先将布尔值转换为数值,false转换为0,true转换为1。
假使我们另一个操作数不是数字而是null、undefined呢?
可以发现:true、false和null/undefined都不相等。
假设另一个是字符串:
布尔值和字符串的比较,仅有false和空字符串、false和’0’相等。
再看另一个操作数是对象、数组、正则、Date的情况:
我们可以发现:
在泛对象类型,即将数组、正则、Date、函数也看作对象类型的情况下,仅有false和空数组[]相等,其他都不想等。
综合以上,我们可以总结如下:
当有一个操作数是布尔值时,仅有false==”、false==’0’、false==[]、false==0、true==1几种情况返回true。
总结如下:
数字和和其他类型的相等操作,仅有0==”、0==[]、0==false、1==true、n==’n’(n为数字,且n不为NaN,可以为Infinity)几种情况返回true。
总结如下:
字符串和和其他类型的相等操作,仅有‘’==0、”==[]、”==false、’n’==n(n为数字,且n不为NaN,可以为Infinity) 几种情况返回true。
四、有一个操作数是null、undefined
通过以上,我们已经知道null和undefined和以上类型都不相等。那么和对象、数组、正则、Function、Date呢?
总结如下:
null或者undefined和其他类型的相等操作,仅有null==undefined、undefined==null返回true。
当两个操作数都是泛对象,但彼此细分来类型并不相同时,如下:
可以发现,全都返回false。
总结一下:
泛对象类型和其他类型的相等操作,全部返回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。
一、有一个操作数是布尔值
我们在浏览器中输入以下示例: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==[]、false==0、true==1几种情况返回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 Infinit d910 y=='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==[]、0==false、1==true、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和其他类型的相等操作,仅有null==undefined、undefined==null返回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。
相关文章推荐
- 规则 2.13:不同类型的操作符混合使用时,使用括号进行隔离。
- 使用指针类型参数和使用指针引用类型参数在函数内部用new给参数分配空间的不同结果
- PHP两个字符串比较(人为出错),两字符串类型和数据表面相等,但strcmp()结果不为0
- Java为什么两个值相等的对象==比较返回false而两个值相等的不同类型的的基本数据类型返回true
- 主键字段使用不同数据类型的简单比较
- printf函数使用—针对不同数据类型的输出结果详解
- PL/SQL使用复合数据类型4(集合操作符、比较集合)
- SQL SERVER中LIKE使用变量类型输出结果不同
- C语言学习2:sizeof ,数据类型,scanf,算式操作,赋值与比较操作,逻辑操作,位的操作,条件运算符,特异赋值结果,强制转换,使用变量要注意的
- 不知道数据库中表的列类型的前提下,使用JDBC正确的取出数据(取出Result结果集中的字段(不同类型))
- 基本数据类型、引用数据类型相互之间的比较规范(相等运算符的使用)
- 《Effective C#》Item 3:使用as和is操作符来做类型转换
- [转]比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]
- C语言不同类型变量与零值比较的规范写法
- 转:《Effective C#》Item 3:使用as和is操作符来做类型转换
- asp.net 中使用1个DataGrid控件,显示不同表查询的结果的方法。
- 使用Groovy "*“ 操作符
- T-SQL中的比较实用技巧,处理数字为小数点后两位和判断类型显示不同文字
- 在ASP.NET中使用Response.ContentType="类型名";来确定输出格式
- 如果比较表中同类型多列值是否相等?