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 = ...
随机推荐
- HOJ 1004: Prime Palindromes
问题:输入两个整数 a 和 b (5 <= a < b <= 1,000,000,000),输出 [a, b] 内的所有回文质数. 最简单的暴力解法是依次遍历 [a, b] 范围内的 ...
- linux 内核学习之八 进程调度过程分析
一 关于进程的补充 进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule() ...
- java基础之 工具类
一.StringUtils StringUtils.isEmpty(null) && StringUtils.isEmpty(""); // true String ...
- 7月10日——[HouseStark] 扬帆起航--第一次会议
本次会议为小组成员第一次会议 内容:每个成员提出一个及以上的项目及内容,成员内部商议并投票决定要做的项目 会议时长:90分钟 地点:电三楼8楼816室 成员 项目 讨论结果 崔文祥 高校就业信息汇总网 ...
- 位置指纹(LF)定位技术简介-室内定位
信号的多径传播对环境具有依赖性,呈现出非常强的特殊性.对于每个位置而言,该位置上信道的多径结构是惟一的,终端发射的无线电渡经过反射和折射,产生与周围环境密切相关的特定模式的多径信号,这样的多径 ...
- Hdu 1004
ps:很简单的一个字符串处理问题.. 代码: #include "stdio.h" #include "string.h" int find(int flag[ ...
- docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储
前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,cli ...
- 关于zero_interconnect_delay_mode和nonzero_interconnect_delay_mode的区别
在执行report_qor命令时,需要注意这样一个问题,对于Reg_2_Reg路径,在worst scene情况下,nonzero模型要比zero模型报出的结果差,但在best scene情况下,却要 ...
- 开源一个silverlight上的文本编辑器:SlEditor
控件设置三个状态:编辑.设计.查看. 控件的内容可以打包保存为zip格式,内容可以包含图片等元素(解决了silverlight RichTextBox控件xaml属性无法获取InlineUIConta ...
- Java面向对象基础知识汇总
OOP:Orient Object Programe AOP:Aspect Orient Programe 封装:Encapsulation 继承:Inheritance 多态:Polymorphmi ...