null、undefined、false、0相等性比较
之前在看《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相等性比较的更多相关文章
- 0,null,undefined,[],{},'',false之间的关系
0与一些虚值的比较: 0与false 0==false true 0与'': =='' true 0与[]: ==[] true 0与NaN: 0==NaN false 0与undefined 0== ...
- null,undefined.'',false关系
null == undefined //truefalse =='' //true boolean类型跟其它类型==时,会转换成Number类型 Number类型跟String类型==时,string ...
- null, undefined,"",0,false是什么关系?
null本质上和0,"",false是一类东西,它们都表示一种数据类型的非值.正如0表示数字类型的非值,""表示字符类型的非值一样,null表示完全空的对象,即 ...
- 你所不知道的 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 ...
- 【转】Javascript 中的false,零值,null,undefined和空字符串对象
js 开发中经常会碰到判断是否为空的情况,关于 null 和 undefined 的区别了解的不是很好,刚好看见这篇文章,转过来学习一下,以下是转载正文: 在Javascript中,我们经常会接触到题 ...
- Javascript 中的false,零值,null,undefined和空字符串对象
在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象--false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来 ...
- Js 中的false,零值,null,undefined和空字符串对象
转自 http://www.imkevinyang.com/2009/07/javascript-中的false零值nullundefined和空字符串对象.html 在Javascript中,我们 ...
- Javascript中的undefined、null、""、0值和false的区别总结
在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...
- js中 null, undefined, 0,空字符串,false,不全等比较
null == undefined // true null == '' // false null == 0 // false null == false // false undefined = ...
随机推荐
- Bootstrap <基础十二>下拉菜单(Dropdowns)
Bootstrap 下拉菜单.下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.这可以通过与 下拉菜单(Dropdown) JavaScript 插件 的互动来实现. 如需使用下列菜单,只需要在 ...
- centos下搭建lamp环境
1 在线安装所有的服务 yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-p ...
- I/O Directory类
Directory类 Directory类位于System.IO 命名空间.Directory类提供了在目录和子目录中进行创建移动和列举操作的静态方法.此外,你还可以访问和操作各种各样的目录属性. 1 ...
- 1、jvm的体系结构
jvm包括两子系统两组件 a.两子系统:Class Loader子系统,Execution engine子系统 b.两组件:Runtime Date Area 和 Native Interface
- WPF 调用WinForm控件
WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...
- webdriver无法打开firefox
1.执行webdriver.firefox()报错,提示: WebDriverException: Message: "Can't load the profile. Profile Dir ...
- AngularJs的UI组件ui-Bootstrap分享(九)——Alert
alert指令会在页面上显示一条提示消息,效果是这样: 代码为: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" ...
- zookeeper+dubbo-admin开发dubbo应用
前面的章节中我们已经安装好了zookeeper,tomcat了.今天我们来实现一个完整的从dubbo消息产生到消费的完整流程. 1.dubbo api 2.dubbo consumer 消费者 3.d ...
- ADO.NET与ORM的比较:NHibernate实现CRUD(转)
原文地址 http://blog.csdn.net/zhoufoxcn/article/details/5402511 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spr ...
- http 请求详解大全
HTTP 100 Continue继续 101 Switching Protocols切换协议 200 OK正常 201 Created已创建 202 Accepted已接受 203 Non-Auth ...