容易发生类型转换错误的另一个地方,就是流控制语句。像if之类的语句在确定下一步操作之前,会自动把任何值转换成布尔值。尤其是if语句,如果使用不当,最容易出错。来看下面的例子。
function concat(str1,str2,str3){ var result= str1 + str2; if (str3){ //绝对不要这样 result += str3; } return result; }
这个函数的用意是拼接两或三个字符串,然后返回结果。其中,第三个字符串是可选的,因此必须要检查。第3章曾经介绍过,未使用过的命名变量会自动被赋予undefined值。而undefined值可以被转化成布尔值false,因此这个函数中的if语句实际上只适用于提供了提三个参数的情况。问题在于,并不是只有undefined才会被转化成false,也不是只有字符串值才可以转换为true。例如,假设第三个参数是数值0,那么if语句的测试就会失败,而对数值1的测试则会通过。
在流控制语句中使用非布尔值,是极为常见的一个错误来源。为避免此类错误,就要做到在条件比较时切实传入布尔值。实际上,执行某种形式的比较就可以达到这个目的。例如,我们可以将前面的函数重写如下。
function concar(str1,str2,str3){ var result = str1 + str2; if(typeof str3 == "string"){ //恰当的比较 result += str3; } return result; }
在这个重写后的函数中,if语句的条件会基于比较返回一个布尔值。这个函数相对可靠得多,不容易受非正常值得影响。
————————————————————————————————————————————————————————————————————————————
这个让我来写,一上来肯定是写成错误的形式,平常对强制转换没怎么在意。