# 隐式转换
js的==
,比较两边元素时,其实就是采用的隐式转换。
参考这篇文章 (opens new window)的结论:
首先看双等号前后有没有
NaN
,如果存在NaN
,一律返回false
再看双等号前后有没有布尔,有布尔就将布尔转换为数字(
false
是0
,true
是1
)接着看双等号前后有没有字符串, 有三种情况:
- 对方是对象,对象使用
toString()
或者valueOf()
进行转换; - 对方是数字,字符串转数字;(前面已经举例)
- 对方是字符串,直接比较;
- 其他返回
false
- 对方是对象,对象使用
如果是数字,对方是对象,对象取
valueOf()
或者toString()
进行比较, 其他一律返回false
null
,undefined
不会进行类型转换, 但它们俩相等
TIP
一方是数字或字符串,对方是对象,将先调用valueOf()
,
结果如果是null
或undefined
,返回false
;
如果是基本数据类型(字符串或者数字或boolean
),直接比较;
其它再调用toString()
进行比较
出一道题:
aa = {};
aa.toString = ()=> 1;
aa.valueOf = ()=> 2;
console.log(aa == 1);//false
aa.valueOf = ()=> [];
console.log(aa == 1);//true
aa.valueOf = ()=> undefined;
console.log(aa == 1);//false
aa.valueOf = ()=> false;
console.log(aa == 1);//false
也还有道经典的面试题:
var a = ?;
if (a == 1 && a == 2 && a==3){
console.log('-------');
}
以上空出的代码写什么,才能有字符串打印出来? 其实就是利用前面的转换特性:
var a = {
value: 1
};
a.valueOf = function(){
return this.value++;
};
这里使用toString
也是一样的。