因为JavaScript 是松散类型的,所以变量和函数参数都不能保证会使用正确的数据类型。开发者需
要自己检查数据类型,确保不会发生错误。数据类型错误常发生在将意外值传给函数的时候。
在前面的例子中,代码检查了第三个参数的数据类型,以确保它是字符串,但根本没有检查另外两
个参数。如果函数必须返回一个字符串,那么只传入两个数值,忽略第三个参数就会破坏约定。下面的
函数也存在类似问题:
// 不安全的函数,任何非字符串值都会导致错误
function getQueryString(url) {
const pos = url.indexOf(“?”);
if (pos > -1){
return url.substring(pos +1);
}
return “”;
}
这个函数的用途是返回给定URL 的查询字符串。为此,它先用indexOf()在字符串中寻找问号,
如果找到则使用substring()方法返回问号后面的所有内容。这两个方法都是只有字符串才有的,因
此传入其他类型的值就会导致错误。下面的简单类型检查可以保证函数少出错:
function getQueryString(url) {
if (typeof url === “string”) { // 通过类型检查保证安全
let pos = url.indexOf(“?”);
if (pos > -1) {
return url.substring(pos +1);
}
}
return “”;
}
在这个重写的版本中,第一步检查了传入的值确实是字符串。这样可以保证函数永远不会因为非字
符串值而出错。
如上一节所述,因为存在类型转换,所以应该避免在流控制语句中使用非布尔值作为条件。另外这
也是可能导致类型错误的一个做法。来看下面的函数:
// 不安全的函数,非数组值可能导致错误
function reverseSort(values) {
if (values) { // 不要!
values.sort();
values.reverse();
}
}
reverseSort()函数可以使用数组的sort()和reverse()方法,将数组反向排序。由于if 语句
中的控制条件,任何非数组值都会被转换为true,从而导致错误。另一个常见的错误是将参数与null
比较,比如:
// 还是不安全的函数,非数组值可能导致错误
function reverseSort(values) {
if (values != null){ // 不要!
values.sort();
values.reverse();
}
}
用参数值与null 比较只会保证不是两个值:null 和undefined(对于使用相等和不相等操作符
而言是等价的)。与null 比较不足以保证适当的值,因此不要使用这种方式。出于同样的原因,也不
推荐与undefined 比较。
另一个错误的做法是在检测特性时只检查使用的特性。下面是一个例子:
// 仍是不安全的函数,非数组值可能导致错误
function reverseSort(values) {
if (typeof values.sort === “function”) { // 不要!
values.sort();
values.reverse();
}
}
在这个例子中,代码检查了参数上是否存在sort()方法。假如传入的参数确实有一个sort()方
法,但参数本身不是数组,那么在执行reverse()时也会报告错误。如果知道预期的确切类型,那么
最好使用instanceof 来确定值的正确类型,如下所示:
// 安全,非数组值被忽略
function reverseSort(values) {
if (values instanceof Array) { // 修复
values.sort();
values.reverse();
}
}
最后一个reverseSort()是安全的,它测试了values 参数是不是Array 的实例。这样,函数可
以保证忽略非数组参数。
一般来说,原始类型的值应该使用typeof 检测,而对象值应该使用instanceof 检测。根据函数
的用法,不一定要检查每个参数的数据类型,但对外的任何API 都应该做类型检查以保证正确执行。
javascript七基础学习系列一千九百二十四:数据类型错误
最新推荐文章于 2024-08-27 13:38:21 发布