识别错误
首先你得知道你的错误在哪里,在什么地方出现错误。因为JavaScript是松散类型的,对于函数是不会进行验证的。所以说,一般都是要等代码运行起来才会发现错误。
一般情况来说需要注意几种类型错误经常发生:
- 类型转换错误
- 数据类型错误
- 通信错误
通常都是不清楚值的类型导致的错误。
检查工具
- 静态代码分析
- 代码检查器
值的说的是在代码构建流程中添加上静态代码分析器或者代码检查器,可以预先让你知道一些错误。这样的工具有非常多,常见的有几个:
JSHint、JSLint、Google Closure和TypeScript。
静态代码分析器要求使用类型、函数签名及其他指令来注解JavaScript,以此描述程序如何在基本可执行代码之外运行。分析器会比较注解和JavaScript代码的各个部分,对在实际运行时可能出现的潜在不兼容问题给出提醒。
类型转换错误
类型转换错误主要是因为使用了会自动改变某个值的数据类型的操作符或语言构造。例如布尔值,使用等于(==)或者不等于(!=)的时候就会经常发生这类型错误。还有的是流程控制语句使用非布尔值的语句。
1 == true; // true
"1" == true; // true
1 === true // false
"1" === true; // false
等于操作符和不等于操作符在进行判断时,会把两个不相同类型的转换为相同类型的来比较。所以说很容易发生类型错误。而使用严格相等(!===)或者严格不相等(!==)的情况下就不会发生类型转换来比较。使用严格相等和严格不相等可以避免类型错误。但是也看情况来使用,因为有些地方时不用使用或者说没必要使用的。那就有些大材小用的感觉了。
类型转换错误在if流程控制语句中也是经常发生的。if语句会自动把条件表达式转化为布尔值来进行判定。
function fn(num){
if(num){
...
return true;
}else{
return false;
}
}
全部的类型值转换为布尔值无非就两个,一个是true,还有一个是false。转换为false的也就是:undefined,null,NaN,0,空字符串,false。
没有给参数赋值的话,参数就是undefined,也就是会为false,如果给参数赋值了0,那也是false。那有可能会导致最后的结果不是你想要的那个结果,所以在判断之前就需要知道你判断的什么。如果判断的是类型,那就在前面加上typeof。
数据类型错误
JavaScript的松散类型的变量和函数参数都不能保证会使用正确的数据类型。需要自己检查数据类型,确保不会发生错误。数据类型错误常发生在将意外值传给函数的时候。就好比如,某个函数需要的是一个布尔值,你却传进一段字符串。
一般来说,原始类型的值应该使用typeof检测,而对象值应该使用instanceof检测。根据函数的用法,不一定要检查每个参数的数据类型,但对外的任何API都应该做类型检查以保证正确执行。
通信错误
随着Ajax编程的出现后,Web在运行期间和后天进行动态的交互已经变得非常常见了。
JavaScript和服务器的通信会发生错误。
一般是URL 的格式不规范或者是传送的数据格式错误。通常,在把数据发送到服务器之前没有用encodeURIComponent()编码,会导致这种错误例如,下面的URL格式就不正确:
http://www.yourdomain.com/?redir=http://www.someotherdomain.com?a=b&c=d
也就是要把斜杠之类的要转换。
转换之后就是这样的:
http://www.example.com/?redir=http%3A%2F%2Fwww.someotherdomain.com%3Fa%3Db%26c%3Dd
对于查询字符串,应该都要通过encodeURIComponent()编码。
在服务器响应非预期值时也会发生通信错误。在动态加载脚本或样式时,请求的资源有可能不可用。有些浏览器在没有返回预期资源时会静默失败,而其他浏览器则会报告错误。不过,在动态加载资源的情况下出错,是不太好做错误处理的。有时候,使用Ajax通信可能会提供关于错误条件的更多信息。