之前在看《JavaScript权威指南》的时候看到三个相等性比较的式子:

null == undefined ;// ==>true

undefined == false;// ==>false

null ==false;// ==>false

对于第一个等式我默认是相等的了,就没有在意,但第二和第三个等式我觉得很奇怪,因为之前有看到过一句“下面这些值会被转换成false: undefined、null、0、-0、

' ' 、NaN”,那么为什么后两个等式会不成立呢?当时看书的时候我也没太在意,只是记下来了,但今天又遇到这个问题,我觉得有必要搞清楚。于是,抱着这个疑问我去百度了一下,看了一下,没有直接关于这个问题的讲解,不过也有一些类似的,主要说的是null是对象,但我记得等号是可以进行类型转换的,转换后不是应该相等吗?而且我还增加了一个疑问,我在网上看到另一个式子:

null ==0;// ==>false

但我记得null转化为数字不就是0吗,怎么等式也不成立。我想还是再从定义入手吧,于是重新查看了《JavaScript权威指南》中关于等号进行类型转换的内容,书中是这样说的:

“如果两个操作数的类型相同,则和上文所述的严格相等的比较规则一样。如果严格相等,那么比较结果为相等。如果他们不严格相等,则比较结果为不相等。

如果两个操作数类型不同,“==”相等操作符也可能会认为他们相等。检测相等将会遵守如下规则和类型转换:

—如果一个值是null,另外一个是undefined,则他们相等。

—如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。

—如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。

—如果一个值是对象,另一个值是数字或字符串,则使用3.8.3节所提到的转换规则将对象转换为原始值,然后再进行比较。对象通过toString()方法或者valueOf()方法转换为原始值。JavaScript语言核心的内置类首先尝试使用valueOf(),再尝试使用toString(),除了日期类,日期类只使用toString()转换。那些不是JavaScript语言核心中的对象则通过各自的实现中定义的方法转换为原始值。

—其他不同类型之间的比较均不相等。”

仔细读了几遍这几条规定后,我明白了为什么第二和第三个等式不成立,因为false会首先转换为0,而null和undefined都不带有任何方法,无法进行类型转换,所以不成立了,这也是为什么null ==0;// ==>false。后来我查看了一下《JavaScript高级程序设计》,看到里面有这么一句“要比较相等性之前,不能将null和undefined转换成其他任何值。”说得比较明白了。

这样我之前的疑问算是解决了,但还有个问题,那这句话“下面这些值会被转换成false: undefined、null、0、-0、' ' 、NaN”不是错了吗,null什么情况下会转换成false呢?查看了一下以前的笔记,发现做显式类型转换的时候有几个函数如Number()、Boolean(),而隐式转换也等价于调用这些函数,null、undefined虽然没有方法,但它们依然可以用函数转换类型。

总结一下,因为等号比较的时候null和undefined不能转换类型,因此不等于0和false。通过这次解疑,我还注意到之前看过,但没注意的内容,比如,布尔值比较时会先转换为数字。我感觉看过和记得都不能说明理解了,要经过实践后,感觉没有疑问了,真的觉得该是这样,而不是因为书上这么说,那个时候才算是理解了,也就是说实践和思考很重要。

null、undefined、false、0相等性比较的更多相关文章

  1. 0,null,undefined,[],{},'',false之间的关系

    0与一些虚值的比较: 0与false 0==false true 0与'': =='' true 0与[]: ==[] true 0与NaN: 0==NaN false 0与undefined 0== ...

  2. null,undefined.'',false关系

    null == undefined //truefalse =='' //true boolean类型跟其它类型==时,会转换成Number类型 Number类型跟String类型==时,string ...

  3. null, undefined,"",0,false是什么关系?

    null本质上和0,"",false是一类东西,它们都表示一种数据类型的非值.正如0表示数字类型的非值,""表示字符类型的非值一样,null表示完全空的对象,即 ...

  4. 你所不知道的 JS: null , undefined, NaN, true==1=="1",false==0=="",null== undefined

    1 1 1 === 全相等(全部相等) ==  值相等(部分相等) demo: var x=0; undefined var y=false; undefined if(x===y){ console ...

  5. 【转】Javascript 中的false,零值,null,undefined和空字符串对象

    js 开发中经常会碰到判断是否为空的情况,关于 null 和 undefined 的区别了解的不是很好,刚好看见这篇文章,转过来学习一下,以下是转载正文: 在Javascript中,我们经常会接触到题 ...

  6. Javascript 中的false,零值,null,undefined和空字符串对象

    在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象--false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来 ...

  7. Js 中的false,零值,null,undefined和空字符串对象

    转自  http://www.imkevinyang.com/2009/07/javascript-中的false零值nullundefined和空字符串对象.html 在Javascript中,我们 ...

  8. Javascript中的undefined、null、""、0值和false的区别总结

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...

  9. js中 null, undefined, 0,空字符串,false,不全等比较

    null == undefined // true null == ''  // false null == 0 // false null == false // false undefined = ...

随机推荐

  1. Object有哪些公用方法

    Object是所有类的父类,任何类都默认继承Object.Object类到底实现了哪些方法? 1.clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出 ...

  2. React Native 组件样式测试

    View组件默认样式(注意默认flexDirection:'column') {flexGrow:0,flexShrink:0,flexBasis:'auto',flexDirection:'colu ...

  3. MySQL主从同步报错排错结果及修复过程之:Slave_SQL_Running: No

    起因调查: 收到大量邮件报警想必事出有因,就问同事到底发生了什么?同事登录从库查看,发现出现如下报错提示,表示与主库同步失败,一直卡在哪里,看他弄了两个多小时,问题越来越多,解决一个恢复平静了一两分钟 ...

  4. 让powershell同时只能运行一个脚本(进程互斥例子)

    powershell,mutex,互斥,进程互斥,脚本互斥 powershell脚本互斥例子,在powershell类别文章中,声明原创唯一. powershell 传教士 原创文章 2016-07- ...

  5. C#与Java在继承静态类上的区别

    interface ITest { int Get(); } abstract class Test : ITest //此处会出现错误:Programe.Test不实现接口成员Program.ITe ...

  6. 微信平台上遇到的bug

    做微信平台遇到的bug,没有什么方法修改,至今只是避免出现,还未解决 1.header的position:fixed定位:如果整个页面的高度不足屏幕高度时,安卓部分手机header与title之间会有 ...

  7. jsp取得绝对路径的方法(避免请求转发的方式导致路径错误)

    <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+re ...

  8. C# 时间计算 今天、昨天、前天、明天 一个月的开始日期与结束日期

    C# 时间计算    今天.昨天.前天.明天   class Program    {        static void Main(string[] args)        {          ...

  9. BZOJ 1668 馅饼里的财富

    RT. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  10. Jquery仿彩票更换数字动画效果

    <script type="text/javascript" src="jquery-1.11.3.min.js"></script> ...