`
快乐_虫
  • 浏览: 7111 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    理解javascript中undefined和null的区别

    理解javascript中undefined和null的区别

    javascript 中null和undefined区分和比较

    javascript 中null和undefined区分和比较 Undefined类型 Undefined 类型只有一个值,即特殊 undefined 。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined , 例如: var message; alert(...

    JavaScript中undefined和null的区别

    JavaScript中undefined和null的区别 JavaScript两个表示”无”的值:undefined和null。我在平时只是null用的多一点,undefined只是在报错中经常遇到。下面针对这两个数据类型的异同做一下详细的比较。 1.undefined和...

    JavaScript中Null与Undefined的区别解析

    在JavaScript中存在这样两种原始类型:Null与Undefined。这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undefined类型只有一个值,即undefined。当声明的变量还未被...

    JavaScript null和undefined区别分析

    一时间不好回答,特别是... null 是 JavaScript 保留关键字。 null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值: 表达式:123 + null 结果值:123 表达式:123 * null 结果

    JavaScript中的null和undefined用法解析

    null和undefined属于js中两种不同的基本数据类型,都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。并且在if语句的判断条件中,它们都会自动转为false,相等...

    JavaScript中的null和undefined解析

    在JavaScript开发中,被人问到:null与undefined到底有啥区别? 一时间不好回答,特别是undefined,因为这涉及到undefined的实现原理。于是,细想之后,写下本文,请各位大侠拍砖。 总所周知:null == undefined ...

    JavaScript中null与undefined分析

    1.javascript中定义而未赋...//output undefined==testundefined } 2.javascript中null和undefined是相等的。 代码如下: var testNull=null; var testundefined; if(testNull==testundefined){ alert(“undefined==test

    Javascript类型系统之undefined和null浅析

    本文将详细介绍javascript中的undefined和null 历史原因  1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。根据C语言的传统,null被设计成可以自动转为0  但是,JavaScript的设计者...

    浅谈JavaScript中null和undefined

    实际上,通常认为null是它自有类型的唯一一个成员,它可以表示数字、字符串和对象是“无值”的。  JavaScript还有第二个值来表示值的空缺,就是undefined啦,用未定义的值表示更深层次的“空值”。undefined出现有4...

    Javascript类型系统之undefined和null浅析_.docx

    Javascript类型系统之undefined和null浅析_.docx

    JavaScript面试题和答案

    evel函数可以接受一个字符串作为参数,并把此字符串当做一段javascript代码去执行,如果字符串执行结果是一个值则返回此值,否则返回undefined。如果参数不是一个字符串,则直接返回该参数 40.数组的join方法和字符...

    JavaScript中的null和undefined区别介绍

    JavaScript中存在2个代表信息不存在的特殊值:null和undefined。个人认为可以从以下角度来理解这两个特殊值之间的区别: 1.null代表有存储信息的容器(比如之前被赋过值的变量),但该容器中的内容为空。 2.undefined...

    Javascript中的false、0、null、undefined和空字符串对象[归类].pdf

    Javascript中的false、0、null、undefined和空字符串对象[归类].pdf

Global site tag (gtag.js) - Google Analytics