`
快乐_虫
  • 浏览: 7529 次
  • 性别: 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`是一种特殊的值,它代表变量已经被声明但没有赋值。在...

    JavaScript中Null与Undefined的区别解析

    在JavaScript编程语言中,Null和Undefined是两种不同的原始值,它们在特定场景下有特定的含义,有时也会引起初学者的困惑。理解这两者之间的差异是编写健壮JavaScript代码的关键。 首先,Undefined类型是一个特殊的...

    js判断undefined类型,undefined,null,NaN的区别

    在 JavaScript 中,undefined、null、NaN 是三个经常被混淆的概念,但它们有着不同的含义和用途。今天,我们将深入探讨这三个概念的区别和应用。 undefined 在 JavaScript 中,undefined 是一个基本数据类型,表示...

    JavaScript中undefined和null的区别

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

    深入解析JavaScript中的`undefined`与`null`:探索它们的异同

    本文将深入探讨undefined和null的含义、用途以及如何在JavaScript中正确区分和使用它们。 理解undefined和null的区别对于JavaScript开发者来说至关重要。它们在表示“没有值”的概念时有着不同的用途和含义。通过...

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

    JavaScript 类型系统中的 `undefined` 和 `null` 是两种特殊的原始值,它们分别代表不同的概念。`undefined` 主要用于表示变量已经声明但未被赋值的情况,而 `null` 则是一个特意设置的值,通常用来表示一个“空”的...

    浅谈JavaScript中null和undefined

    在JavaScript编程语言中,null和undefined是两个非常基础且常用的特殊值。尽管它们看起来相似,但它们在JavaScript中有着本质上的区别和各自的应用场景。本文将详细探讨这两个特殊值的相同点和不同点,以及在实际...

    js中 关于undefined和null的区别介绍.docx

    在JavaScript中,使用`==`比较运算符比较`undefined`和`null`会得到`true`,因为这两个值在松散相等比较中被视为相等。然而,使用严格相等运算符`===`比较时,它们被认为是不相等的,因为它们是两种不同的数据类型:...

    JavaScript null和undefined区别分析

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

    JavaScript中null与undefined分析

    虽然`null`和`undefined`在某些情况下看起来很相似,并且在某些比较操作中它们可能被认为是相等的(例如`null == undefined`),但实际上它们有着本质的不同: 1. **数据类型不同**:`undefined`是一种原始类型的值...

    JavaScript中的null和undefined用法解析

    在JavaScript编程语言中,`null` 和 `undefined` 是两个重要的概念,它们都用来表示某种“不存在”或“没有”的状态,但它们之间存在着微妙的差异。了解这些差异对于编写健壮的JavaScript代码至关重要。 首先,`...

    javascript类型系统--undefined和null全面了解_.docx

    JavaScript 类型系统中的 `undefined` 和 `null` 是两种特殊的原始值,它们分别代表不同的概念。在 JavaScript 中,每个变量都有一个类型,当变量未初始化或引用的对象不存在时,就会出现 `undefined` 或 `null`。 ...

    JavaScript中的null和undefined解析

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

Global site tag (gtag.js) - Google Analytics