关于条件判断和类型转换

问题一: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方法。

你可能感兴趣的:(关于条件判断和类型转换)