先抛出两个问题:
1.[]==false 是否成立
2.if([]){ console.log('123') } 能否打印
结果:其实第一个是成立的,第二个也是能打印的,那么问题来了,既然空数组等于false成立,为什么还能执行if里的语句呢?
要解答这个看似矛盾的问题,需要从相等操作符和if语句的条件表达式说起
相等操作符比较规则
1.如果有个操作数是布尔值,则在比较相等性之前,先将其转为数值,false->0,true->1
2.如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前,先将字符串转为数值
3.如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较
4.null和undefined是相等的,且在比较之前不能将其转换为其他任何值
5.如果一个操作数是NaN,则相等操作符返回false,注意NaN不等于NaN
6.如果两个操作数都是对象,则比较它们是不是同一对象,如果两个操作数都指向同一个对象,则相等操作符返回true,否则返回false
额外点:===仅比较而不转换
第一个问题可以用以上的3和1来解答
[].valueOf() //返回数组对象本身
Number(false) //0
Number([].valueOf()) //0
if语句的条件表达式,js会自动调用Boolean()将条件表达式转换为布尔值
Boolean([]) //true 故第二个问题可以打印
对于任何不是null的对象,Boolean()都可将其转换为true
那么再抛一个问题:
if(-1){ console.log('123') } 会打印吗
其实同样会打印
注意:对于数字类型的值,除了0和NaN,Boolean()都可将其转换为true
网友评论