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 = ...
随机推荐
- 二、Python 数据类型
计算机是用来辅助人类工作的,能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数据类型,在程序设计中映射了现实世界的分类,以便于抽象的分析 序列:不 ...
- C++ 类模板的使用
从事C++挺久了,在前段时看书时,发现高手,都是在写模板无,泛型编程,顿感差距.自己连模板都没有写,于是就小小的研究了下模板的用法. 模板简而言之就是对某此对象的相同方法,或处理方式,进行归纳,总结, ...
- Plupload上传组件 + javaweb实现上传源码以及DEMO
Plupload 是一个Web浏览器上的界面友好的文件上传模块,可显示上传进度.图像自动缩略和上传分块.可同时上传多个文件: 上网找了很多Plupload的DEMO都无法正常使用, 而且Pluploa ...
- Nginx+Tomcat构建动、静分离WEB架构
一.简介 二.环境介绍 三.后端服务器安装配置 四.安装论坛 五.安装配置前端Nginx服务器 六.验证服务 一.Tomcat简介 Tomcat是Apache 软件基金会(Apache Softwar ...
- unity 发布web player版,网页打开报Failed to initialize player's 3D settings
开始时我装的是unity 5.0.0b1,不知道在哪找的这个版本. web player 装的什么版本也忘了. 最后卸载了web player,重新安装web player并另外安装一个unity4. ...
- 2014年7月份第3周51Aspx源码发布详情
Froor高校校园网站源码 2014-7-18 [VS2010]源码介绍:这是一款有关高校门户网站的毕业设计源码,功能相对比较完善,界面也比较美观,对门户网站感兴趣的朋友们可以下载研究一下.该源码功 ...
- https适配
http://www.jianshu.com/p/f312a84a944c http://www.2cto.com/kf/201611/570823.html http://www.cnblogs.c ...
- iShare.js分享插件
iShare.js是一个小巧的分享插件,纯JS编写,不依赖任何第三方库,使用简便. 为啥写这个插件? 因为在搭建个人blog时(还没有搭建好(¯﹃¯)),对目前国内比较受欢迎的分享插件都不太满意,主要 ...
- c# System.Data.OracleClient需要Oracle客户端软件8.1.7或更高版本
前几天遇到了这个问题,情景是与oracle数据库连接的时候出现的.本机已经安装了客户端,使用toad数据库工具能够与数据库相连进行相关的操作.但是在使用代码进行连接的时候出现了这样的问题.找了好久,都 ...
- 编程等宽字体Source Code Pro(转)
Source Code Pro - 最佳的免费编程字体之一!来自 Adobe 公司的开源等宽字体下载 每一位程序员都有一套自己喜爱的代码编辑器与编程字体,譬如我们之前就推荐过一款"神 ...