建议4:注意JavaScript数据类型的特殊性(3)
其中,object表示对象的通用类型,class表示对象的内部类型,内部类型的名称与该对象的构造函数名对应。例如,Array对象的class为“Array”,Function对象的class为“Function”,Date对象的class为“Date”,内部Math对象的class为“Math”,所有Error对象(包括各种Error子类的实例)的class为“Error”。
客户端JavaScript的对象和由JavaScript实现定义的其他所有对象都具有预定义的特定class值,如“Window”、“Document”和“Form”等。用户自定义对象的class值为“Object”。
class值提供的信息与对象的constructor属性值相似,但是class值是以字符串的形式提供这些信息的,而不是以构造函数的形式提供这些信息的,所以在特定的环境中是非常有用的。如果使用typeof运算符来检测,则所有对象的class值都为“Object”或“Function”,所以此时的class值不能够提供有效信息。
但是,要获取对象的class值的唯一方法是必须调用Object对象定义的默认toString()方法,因为不同对象都会预定义自己的toString()方法,所以不能直接调用对象的toString()方法。例如,下面对象的toString()方法返回的就是当前UTC时间字符串,而不是字符串“[object Date]”。
- var d = new Date();
- alert(d.toString()); //当前UTC时间字符串
要调用Object对象定义的默认toString()方法,可以先调用Object.prototype.toString对象的默认toString()函数,再调用该函数的apply()方法在想要检测的对象上执行。结合上面的对象d,具体实现代码如下: - var d = new Date();
- var m = Object.prototype.toString;
- alert(m.apply(d)); //" [object Date] "
下面是一个比较完整的数据类型安全检测方法。 - // 安全检测JavaScript基本数据类型和内置对象
- // 参数:o表示检测的值
- /* 返回值:返回字符串"undefined"、"number"、"boolean"、
"string"、"function"、"regexp"、"array"、"date"、"error"、"object"或"null" */ - function typeOf(o){
- var _toString = Object.prototype.toString;
- // 获取对象的toString()方法引用
- // 列举基本数据类型和内置对象类型,可以进一步补充该数组的检测数据类型范围
- var _type ={
- "undefined" : "undefined",
- "number" : "number",
- "boolean" : "boolean",
- "string" : "string",
- "[object Function]" : "function",
- "[object RegExp]" : "regexp",
- "[object Array]" : "array",
- "[object Date]" : "date",
- "[object Error]" : "error"
- }
- return _type[typeof o] || _type[_toString.call(o)] || (o ? "object" : "null");
- }
应用示例: - var a = Math.abs;
- alert(typeOf(a)); //"function"
上述方法适用于JavaScript基本数据类型和内置对象,而对于自定义对象是无效的。这是因为自定义对象被转换为字符串后,返回的值是没有规律的,并且不同浏览器的返回值也是不同的。因此,要检测非内置对象,只能够使用constructor属性和instaceof运算符来实现。
时间: 2024-11-05 22:38:45