欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-09 12:46:15
...
有些情况的比较是不是能搞得你发疯?
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