前面有一篇提到了PHP中的两个等号与三个等号(http://iat.net.cn/double-equals-and-triple-equals-in-php.html),主要是因为PHP是弱类型语言,不同类型的数据类型也是可以比较的,这时候会强制类型转换,如果不加注意的话,很可能会发生意想不到的结果。同样,javascript也是弱类型的语言,做比较运算的时候也需要清楚对应的转换规则。
区别==
===
之前,让我们先熟悉一下javascript中的各种数据类型。
javascript中的数据类型
javascript中有五种基本数据类型:Boolean、Number、String、Undefined、Null,另外还有一种复杂数据类型:Object。前三种数据类型、复杂数据类型与其它语言中对应的数据类型相似,不再赘述,这里主要区别一下null和undefined。
undefined
undefined类型只有一个值,即undefined。当声明的变量未初始化时,该变量的默认值为undefined。使用如下示例进行检测:
|
|
但是,如果对一个为定义的变量进行typeof检测时,也会发现结果是“undefined”,而实际上“变量未初始化”并不等于“变量未定义”,如下:
|
|
null
null类型也只有一个值,即null。有说法,值undefined实际上是从值null派生来的,所以ECMAScript把他们定义为相等的,即null == undefined
。
|
|
尽管两个值相等,但含义却不同,undefined是声明但未初始化的变量的值,null是不存在的对象的值。从逻辑角度看,null值表示一个空对象指针,这也正是null用typeof检测时返回object的原因。
|
|
“==” 与 “===”
先看如下示例
|
|
结果如下:
|
|
将boolean、number、string这三种类型进行不同类型的==比较时,其规则是,总将两边的值转换成数字,再看看转换结果数字是否相等。所以,true被转换成1,与123数字相比就不等了;“abc”被转换成NaN(Not a Number 非数字)与true(1)也就不等了。
那么,null为什么不等于false呢?null是对象,是空对象,没有任何属性和方法。其实,null是既不等于1也不等于0的,也就是说null == false
和 null == true
返回的都是false。实际上null是强制转换成undefined的,也就是最后一个null == undefined
返回的是true。
undefined == false
返回false是不是也是同样的道理呢?
|
|
也就是说undefined根本就不是一个数字,当然就不会等于false(0)了。
另外值得注意的是,我们知道,一般情况下,两个相等的值用==判断总是相等的。但是,javascript中的NaN是个例外,即NaN == NaN
是false。那怎么判断一个变量不是数字呢?javascript中提供一个isNaN()函数用于检测是否为NaN,isNaN(NaN)即是true。
参考资料:
《改善JavaScript程序的188个建议》建议4:注意JavaScript数据类型的特殊性;建议8:谨慎使用运算符
《编写高质量JavaScript代码的68个有效方法》 第3条:当心隐式的强制转换