JavaScript中的两个等号与三个等号

前面有一篇提到了PHP中的两个等号与三个等号(http://iat.net.cn/double-equals-and-triple-equals-in-php.html),主要是因为PHP是弱类型语言,不同类型的数据类型也是可以比较的,这时候会强制类型转换,如果不加注意的话,很可能会发生意想不到的结果。同样,javascript也是弱类型的语言,做比较运算的时候也需要清楚对应的转换规则。

区别== ===之前,让我们先熟悉一下javascript中的各种数据类型。

javascript中的数据类型

javascript中有五种基本数据类型:BooleanNumberStringUndefinedNull,另外还有一种复杂数据类型:Object。前三种数据类型、复杂数据类型与其它语言中对应的数据类型相似,不再赘述,这里主要区别一下nullundefined

undefined

undefined类型只有一个值,即undefined。当声明的变量未初始化时,该变量的默认值为undefined。使用如下示例进行检测:

1
2
var val;
console.log(typeof(val));//"undefined"

但是,如果对一个为定义的变量进行typeof检测时,也会发现结果是“undefined”,而实际上“变量未初始化”并不等于“变量未定义”,如下:

1
2
3
var val;
console.log(typeof(val));//变量定义未初始化->undefined
console.log(typeof(val2));//变量为定义->undefined
null

null类型也只有一个值,即null。有说法,值undefined实际上是从值null派生来的,所以ECMAScript把他们定义为相等的,即null == undefined

1
console.log(null == undefined);//true

尽管两个值相等,但含义却不同,undefined是声明但未初始化的变量的值,null是不存在的对象的值。从逻辑角度看,null值表示一个空对象指针,这也正是null用typeof检测时返回object的原因。

1
console.log(typeof(null));//"object"

“==” 与 “===”

先看如下示例

1
2
3
4
5
(123 == true)
("abc" == true)
(null == false)
(undefined == false)
(null == undefined)

结果如下:

1
2
3
4
5
(123 == true)//false
("abc" == true)//false
(null == false)//false
(undefined == false)//false
(null == undefined)//true

将boolean、number、string这三种类型进行不同类型的==比较时,其规则是,总将两边的值转换成数字,再看看转换结果数字是否相等。所以,true被转换成1,与123数字相比就不等了;“abc”被转换成NaN(Not a Number 非数字)与true(1)也就不等了。

那么,null为什么不等于false呢?null是对象,是空对象,没有任何属性和方法。其实,null是既不等于1也不等于0的,也就是说null == falsenull == true 返回的都是false。实际上null是强制转换成undefined的,也就是最后一个null == undefined返回的是true。

undefined == false 返回false是不是也是同样的道理呢?

1
2
console.log(Number(undefined));//NaN
console.log(isNaN(undefined));//true,不是数字

也就是说undefined根本就不是一个数字,当然就不会等于false(0)了。

另外值得注意的是,我们知道,一般情况下,两个相等的值用==判断总是相等的。但是,javascript中的NaN是个例外,即NaN == NaN是false。那怎么判断一个变量不是数字呢?javascript中提供一个isNaN()函数用于检测是否为NaN,isNaN(NaN)即是true。


参考资料:

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>