《javascript》高级程序设计——类型转换错误

容易发生类型转换错误的另一个地方,就是流控制语句。像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语句的条件会基于比较返回一个布尔值。这个函数相对可靠得多,不容易受非正常值得影响。

————————————————————————————————————————————————————————————————————————————

这个让我来写,一上来肯定是写成错误的形式,平常对强制转换没怎么在意。

原文地址:https://www.cnblogs.com/canrz/p/3872817.html