浅谈 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 .


回到顶部