常见错误处理
由于JavaScript是松散类型的,而且也不会验证函数的参数,因此错误只会在代码运行期间出现。一般来说,有三种错误:
- 类型转换错误
- 数据类型错误
- 通信错误
类型转换错误常常发生在可能会自动转换数据类型的语言结构上。在使用==或!=操作符,或者在if,for,while等流程控制语句使用非布尔值时,最常发生的错误。
我们可以使用全等(===)和不全等(!==)操作符,以避免类型转换。因为它们首先比较数据类型,然后才比较值是否相等,因此我们强烈推荐使用。
容易发生类型转换出错的另一个地方,就是流程控制语句。想if之类的语句在确定下一步操作之前会自动把任何值转成布尔值。例如:
function Fun1(str1, str2, str3) {
var str = str1 + str2;
if (str3) { //这样写容易出现bug
str = str + str3;
}
return str;
}
这个判断的问题在于并非只有string类型的值可以被转成true,假如str3的值是1,也可以通过if语句。我们可以使用下面的方法避开这个漏洞。
function Fun1(str1, str2, str3) {
var str = str1 + str2;
if (typeof str3 == "string") { //需要加上类型判断
str = str + str3;
}
return str;
}
由于JavaScript是松散类型的,所以在不使用变量之前,不能确保它们的数据类型。为了保证不会发生数据类型的错误,只能依靠开发人员编写适当的数据类型检测代码。
function GetQueryString(url) {
if (typeof url == "string") { //确保类型安全
var pos = url.indexOf("?");
if (pos > -1) {
return pos.substring(pos + 1);
}
}
return "";
}
在确切知道什么类型的情况下,推荐使用instanceof来检测其数据类型。
function ReverseArray(arr) {
if (arr instanceof Array); {
arr.sort();
arr.reverse();
}
}
大体来说,基本类型的值应该使用typeof运输符来检测,引用类型则应该用instanceof来检测。
抛出错误
抛出错误也是一个调试代码的好办法。如果错误信息具体,基本上就可以把它当做错误来源的依据。
以上内容来自《JavaScript高级程序设计(第3版)》