容易发生类型转换错误的地方是流控制语句。像if之类的语句在确定下一步操作之前,会自动把任何值转换成布尔值。尤其是if语句,如果使用不当,最容易出错
未使用过的命名变量会自动被赋予undefined值。而undefined值可以被转换成布尔值false,因此下面这个函数中的if语句实际上只适用于提供了第三个参数的情况。问题在于,并不是只有undefined才会被转换成false,也不是只有字符串值才可以转换为true。例如,假设第三个参数是数值0,那么if语句的测试就会失败,而对数值1的测试则会通过
function concat(str1,str2,str3){ var result = str1 + str2; if(str3){ //绝对不要这样 result += str3; } return result; }
在流控制语句中使用非布尔值,是极为常见的一个错误来源。为避免此类错误,就要做到在条件比较时切实传入布尔值。实际上,执行某种形式的比较就可以达到这个目的
function concat(str1,str2,str3){ var result = str1 + str2; if(typeof str3 == 'string'){ //更合适 result += str3; } return result; }
【数据类型错误】
javascript是松散类型的,在使用变量和函数参数之前,不会对它们进行比较以确保它们的数据类型正确。为了保证不会发生数据类型错误,只能编写适当的数据类型检测代码。在将预料之外的值传递绘函数的情况下,最容易发生数据类型错误
//不安全的函数,任何非数组值都会导致错误 function reverseSort(values){ if(values){ values.sort(); values.reverse(); } }
另一个常见的错误就是将参数与null值进行比较。与null进行比较只能确保相应的值不是null和undefined。要确保传入的值有效,仅检测null值是不够的
//不安全的函数,任何非数组值都会导致错误 function reverseSort(values){ if(values != null){ values.sort(); values.reverse(); } }
如果传入一个包含sort()方法的对象(而不是数组)会通过检测,但调用reverse()函数时可能会出错
//不安全的函数,任何非数组值都会导致错误 function reverseSort(values){ if(typeof values.sort == 'function'){ values.sort(); values.reverse(); } }
在确切知道应该传入什么类型的情况下,最好是使用instanceof来检测其数据类型
//安全,非数组值被忽略 function reverseSort(values){ if(values instanceof Array){ values.sort(); values.reverse(); } }
【通信错误】
随着Ajax编程的兴起,Web应用程序在其生命周期内动态加载信息或功能,已经成为一件司空见惯的事。不过,javascript与服务器之间的任何一次通信,都有可能会产生错误
最常见的问题是在将数据发送给服务器之前,没有使用encodeURIComponent()对数据进行编码
//错误 ?redir=http://www.sometherdomain.com?a=b&c=d //针对'redir='后面的所有字符串调用encodeURIComponent()就可以解决这个问题 ?redir=http:%3A%2F%2F%3Fa%3Db%26c%3Dd
以上这篇全面了解javascript中的错误处理机制就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章: