建议4:注意JavaScript数据类型的特殊性(2)
3.正确检测数据类型
使用typeof运算符返回一个用于识别其运算数类型的字符串。对于任何变量来说,使用typeof运算符总是以字符串的形式返回以下6种类型之一:
"number"
"string"
"boolean"
"object"
"function"
"undefined"
不幸的是,在使用typeof检测null值时,返回的是“object”,而不是“null”。更好的检测null的方式其实很简单。下面定义一个检测值类型的一般方法:
- function type(o){
- return (o === null) ? "null" : (typeof o);
- }
这样就可以避开因为null值影响基本数据的类型检测。注意:typeof不能够检测复杂的数据类型,以及各种特殊用途的对象,如正则表达式对象、日期对象、数学对象等。
对于对象或数组,可以使用constructor属性,该属性值引用的是原来构造该对象的函数。如果结合typeof运算符和constructor属性,基本能够完成数据类型的检测。表1.2所示列举了不同类型数据的检测结果。
使用constructor属性可以判断绝大部分数据的类型。但是,对于undefined和null特殊值,就不能使用constructor属性,因为使用JavaScript解释器会抛出异常。此时可以先把值转换为布尔值,如果为true,则说明不是undefined和null值,然后再调用constructor属性,例如:
- var value = undefined;
- alert(typeof value); //"undefined"
- alert(value && value.constructor); //undefined
- var value = null;
- alert(typeof value); //"object"
- alert(value && value.constructor); //null
对于数值直接量,也不能使用constructor属性,需要加上一个小括号,这是因为小括号运算符能够把数值转换为对象,例如: - alert((10).constructor);
使用toString()方法检测对象类型是最安全、最准确的。调用toString()方法把对象转换为字符串,然后通过检测字符串中是否包含数组所特有的标志字符可以确定对象的类型。toString()方法返回的字符串形式如下: - [object class]