zoukankan      html  css  js  c++  java
  • 不同类型间使用相等操作符"=="的比较结果

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

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

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

    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。

  • 相关阅读:
    终端不显示 git branch 名字
    多线程下bufferedwriter若不关闭并不能记下所有log
    anaconda prompt execute jupyter notebook, can't open notebook
    conda 创建新环境下载包失败
    failed to install jupyter_contrib_nbextensions
    failed to install nb_conda
    Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法
    SSL/TLS协议信息泄露漏洞(CVE-2016-2183)解决办法
    记录win NFS公网映射开放端口
    出题器
  • 原文地址:https://www.cnblogs.com/twodog/p/12134744.html
Copyright © 2011-2022 走看看