JavaScript中的null和undefined 以及 “==” 比较的一些细节点

有些情况的比较是不是能搞得你发疯?
123==true  //  false   但是,123转换为布尔值,不是true吗,true和true不相等吗?,but反着想,true转换为number的话为1,这样123确实不等于1,确实会返回false,到底是什么规则呢?
undefined==false    //  false ,  undefined转换为布尔值不是false吗,那为什么返回false呢?
null==false    //  false  ,  也返回false
 
想弄清楚上面这样的问题,我们首先了解JS的(==)比较机制,如下。
 
比较(==)的规律:
如果==两边的数据类型相同则直接进行值得比较 ,如果数据类型不同,则按以下规律比较。
 
当 a 与 b 进行比较  ( a==b ,注意是两个等号) 的时候,如果a、b是基本数据类型(Number,String,Boolean)的数据,并且 a 与 b 为不同类型的值的时候,那么将 a 与 b 都转换成数字(Number)再进行比较。(数据类型转换的规则请看 这里 和  这里
如下所示:
false == 0   // true    ---    false先转换成Number类型,所以false转换为 0 与等号右边的0进行比较,最终返回true
false == "" //    true    ---      false先转换成 0 , 空字符串转换成Number类型也是0,所以返回true
"5" == 5    //    true    ---    原理同上
看到这里,上面让人发疯的问题,看起来弱爆了,基本数据类型都转换成number类型再比较而已!
 
那当基本数据类型和引用数据类型(对象类型)的值进行比较的话,又是什么样的规律呢??
这个也很简单,那就把对象类型也转换成Number类型,再比较喽!值得注意的是对象类型先调用valueOf方法,再调用toString方法,得到基本数据类型的数据,如需要再转为Number类型进行比较 (这里如果是字符串和对象类型比较,对象类型调用toString方法后,==两边就是相同的值类型了,就直接进行字符串的比较了),如果valueOf和toString方法都没有得到基本类型的值,则认定为不相等。 详情见这里
ex:
var a="abc",b={};
alert(a==b);
//a转化为Number类型为NaN,b先调用valueOf得到自己本身,再调用toString方法,得到 " [object Object] ",再转化成Number同样得到NaN,所以最终弹出false
ex2:
var a =false,b=[];
alert(a==b);
//a转化成Number得到0,b调用valueOf和toString方法得到空字符串“”,再转换成Number为0,所以最终弹出true
 
还有第三种情况,==左右两边都是对象类型的数据应该怎样比较?都转换成Number类型再比较吗??
——No!No!No!想多了,两边都是对象类型的话最简单了,直接比较引用地址是否相同,也就是完全比较两边是不是一个对象!是就相等,不是就不相等,即使两个对象存的值都是一模一样的,也不相等!
 
那null和undefined与其他值比较的时候,会怎么转换呢?先理解一下null和ECMAScript怎么看待null和undefined的。
 
我对null和undefined的理解:
一般编程语言中,基本都有且只有一个表示不存在的值---null,而在JavaScript中,有两个值表示不存在,他们就是null和undefined,它们都是标示性的值,null表示主动性的不存在,undefined通常表示意外的不存在。言外之意就是程序中当返回了null是意料之中的,我们就是想让它返回null,而返回undefined的时候,有可能我们的代码就有错误了(如果代码书写规范的话)。
JavaScript通常认为, undefined是基本数据类型(值类型),而null是对象类型(引用类型)的数据!但是null和undefined没有valueOf和toString方法!
因为null本身就是不存在的意思,所以null强制转换成Number类型得到0,强制转换成String类型得到“null”,强制转换成布尔值得到false。undefined强制转换成Number类型得到NaN-这点有点特殊,要记住哦,强制转换成String类型得到“undefined”,强制转换成布尔值得到false。
那么当我们做null或者undefined与其他数据进行比较的时候,是用不到上面的转化规则的!
 
因为undefined被当成基本数据类型,undefined被看成基本值,而又因为undefined转换为数字为NaN,所以undefined与Number、String、Boolean这三种类型比较的时候,总是返回false。
 
而对于null来说,JS把它当成对象来进行比较,即先尝试调用null的valueOf与toString方法,而又因为它没有valueOf和toString方法,所以始终返回false。
 
值得注意的是,null == undefined  是成立的!因为undefined是从Null类派生出来的,所以JS认为他们是相等的。也可以理解为null没有valueof和toString方法,,所以转为基本类型为undefined,那么undefined == undefined,结果也是true。
 
综合以上2点,null和undefined和其他类型比较都是false!
 
了解到这些,就知道下面比较的答案了:
null == undefined  //  true 
false==null   //     false  
undefined == false  //    false
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值