浅谈 javascript 中的比较操作符 ==
我们知道javascript中的比较操作符有2种,== 和 ===
== 是只比较值, === 不仅比较值还比较类型 ,详细的区别自动google去.这里简单说下判断比较操作符 ==
== 此操作符比较常用,但是隐藏的”坑”也不少,你在开发过程中有没有跳到 == 操作符设下的”坑”呢?
由于javascript中的类型转化非常灵活,我们知道除了null,undefined,false,0,”空字符串 转化为布尔型 false 外,其他都是 true,其中有一个例外,NaN 是个非数字类型,NaN!=NaN 成立.这个非常特殊.
javascript中比较操作符规则:
(1)当基本类型比较时,两边会转化成数值,然后进行值的比较.
(2)当基本类型和引用类型比较时,先将引用类型转化为基本类型,会调用引用类型的 valueOf 或者 toString() 方法,然后再进行比较.
比如:
if(‘true’) 为 true, 因为不少空字符串,所以转化为true
if(true) 为 true ,傻子都知道 ^_^
但是 if(‘true’==true) 会是什么呢? 给你2次机会猜一下-_-!
答案是 false
why?
因为上面说了,在基本类型比较中,== 比较操作符比较的是值,换句话说,就是两边的比较对象会被转化为数字,OMG!
‘true’ 是个字符串,转化为数字是NaN true 是布尔值,转化为数字是 1
所以 if(NaN==1) 必然返回 false NaN 不等于任何数字甚至它本身!
我们尝试定义一个引用类型
var person={name:’小小’,age:2}; if(person==’person’)
我们尝试比较引用类型person 和字符串’person’ 是否相等,结果返回false
why?
因为引用类型和基本类型比较时,引用类型先转化为基本类型,但是我们上面的person是字面量定义的对象,并没有实现 valueOf 和 toString 方法,所以我们决定手动加一个.
person.toString=function(){ return ‘person’; }
上面这个对象person的toString 方法比较简单,直接返回字符串 person ,然后我们再进行比较
if(person==’person’) 惊奇的发现,返回true,其实没有什么惊奇的,因为引用类型在转化基本类型时调用toString 方法返回字符串 ‘person’ 后与 字符串’person’ 相比较,结果必然是true .