问题一:JavaScript的条件判断中,如果条件本身不是一个布尔值,代码可读性较差;但是完全是可以运行的。
先看下下面的代码执行情况:
if("hello"){ //条件是一个字符串
console.log("hello"); //输出"hello"
}
if(""){ //条件是空字符串
console.log("empty");//不会输出
}
if(" "){ //条件空格字符串
console.log("blank"); //输出"blank"
}
解密:对于括号里面的表达式,会被强制转换成布尔类型。
原理
类型 | 结果 |
---|---|
undefined | false |
null | false |
number | +0,-0,或者NaN为false,其他为true |
String | 空字符串为false,其他都为true |
Object | true |
问题二:类似"hello == true"
的语句应该怎么计算值?
JavaScript在执行比较语句的时候会做强制类型转换,先看看具体的执行情况:
"" == 0 // true
" " == 0 //true
"" == true //false
"" == false //true
" " == true //false
!" " == true //false
!" " == false //true
"hello" == true //false
"hello" == false //true
"0" == true //false
"0" == false //true
"00" == false //true
"0.00" == false //true
解密:
x | y | 结果 |
---|---|---|
null | undefined | true |
number | String | x == toNumber(y) |
boolean | (any) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
otherwise | otherwise | false |
toNumber
类型 | 结果 |
---|---|
undefined | NaN |
null | 0 |
boolean | true为1,false为0 |
String | "abc"为NaN,"123"为123 |
toPrimitive
对于Object类型,先尝试使用.valueOf方法获取结果。如果没有定义,在尝试调用.toString方法获取结果。
总结:对于大小判断,JavaScript的处理方式是转换成两个数字进行比较,比较特殊的null==undefined //true
;对于普通的类型的转换遵循上面的表格,对于对象的转换要调用valueOf或者toString方法。