首页 > 代码库 > javascript中检测一个变量的类型

javascript中检测一个变量的类型

 1     /** 2      * 怎么检测一个变量的类型? 3      * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. 4      * 另外还可以适应jQuery来检测类型. 5      * */ 6  7  8     /** 9      * 1.使用typeof检测对象类型10      * typeof作为最常用的检测类型方法,返回字符串类型;11      * */12     function testType(value) {13         var str = typeof(value);14         switch(str){15             case ‘undefined‘: //undefined类型16                 console.log(str);17                 break;18             case ‘object‘: //null类型, 任意内置对象, 数组19                 console.log(str);20                 break;21             case ‘boolean‘: //true, false类型22                 console.log(str);23                 break;24             case ‘string‘: //string字符串类型25                 console.log(str);26                 break;27             case ‘function‘: //任意函数28                 console.log(str);29                 break;30             case ‘number‘://任意的数值类型,包含NaN31                 console.log(str);32                 break;33         }34     }35     testType(111);36     /**37      * 可以看出typeof对于基本类型可以测试出类型,但是对于其他的,包括日期, 数组等等大多都返回object类型,而且null也返回的是object类型,也就是没有办法知道确切类型.38      * */

另一种改进的检测方法, 是使用默认的toString(), 继承自Object,可以返回类型信息.

1     function classof(o){2         if(o === null) return "Null";3         if(o === undefined) return "Undefined";4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型5     }

那为什么不直接用 a.toString() 而要用 Object.prototype.toString.call(a) ?

技术分享

如果是数组或者函数,结果会是怎么样?

技术分享

原因是:直接使用toString()有可能这个方法被重写了, 而不是默认的. 使用Object.prototype.toString().call(o).slice(8,-1);得到的结果更加可靠!

完整代码:

 1 function classof(o){ 2         if(o === null) return "Null"; 3         if(o === undefined) return "Undefined"; 4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型 5     } 6     function testType(value) { 7         var str = classof(value); 8         console.log(str); 9         switch(str){10             case ‘undefined‘: //undefined类型11                 console.log(str);12                 break;13             case ‘object‘: //null类型, 任意内置对象, 数组14                 console.log(str);15                 break;16             case ‘boolean‘: //true, false类型17                 console.log(str);18                 break;19             case ‘string‘: //string字符串类型20                 console.log(str);21                 break;22             case ‘function‘: //任意函数23                 console.log(str);24                 break;25             case ‘number‘://任意的数值类型,包含NaN26                 console.log(str);27                 break;28             case ‘Date‘: //日期29                 console.log(str);30                 break;31             case ‘Array‘: //数组32                 console.log(str);33                 break;34             case ‘RegExp‘: //正则35                 console.log(str);36                 break;37         }38     }39     //testType(function(){console.log(this)});//function40     testType();

可以看到改进了一部分

技术分享

2.使用instanceof检测对象类型

对于typeof()检测为Object类型的可以使用instanceof进一步检测具体类型.instanceof实际上检测的是对象的原型.

可以检测变量是不是某个对象的实例,返回bool值.

1 var value = http://www.mamicode.com/new Date();2 var isDate = value instanceof Date;3 console.log(isDate);//true

3.使用constructor检测对象类型

constructor相当于检测构造函数,返回的是一个函数.

 1     function testconstructor(value) { 2         var str = value.constructor; 3         console.log(value.constructor); 4         switch(str){ 5             case Number: 6                 console.log(str); 7                 break; 8         } 9     }10     testconstructor(111); //function Number()

如果需要检测一个对象的确切类型,可以综合使用这三种方法:

 1 function type(o) { 2         var t, c, n;//type class name 3         //null类型 4         if(o === null) return "null"; 5         //是数值中的特殊类型:NaN 6         if(o !== o) return "nan"; 7         //使用typeof检测除去 "object" 类型为的其他类型. 8         if((t = typeof o) !== "object") return t; 9         //typeof检测为"object"类型,则进一步检测10         //可以检测出大部分内置类型11         if((c = classof(o)) !== "Object") return c;12         //classof(o)返回为"Object"时,检测constructor13         if(o.constructor && typeof o.constructor === "function" && (n = o.constructor.getName())) return n;14         //无法识别的其他类型,默认为"Object"15         return "Object";16     }17     function classof(o) {18         return Object.prototype.toString.call(o).slice(8,-1);19     };20 21     //返回function的名称, 可能为""或者 null22     Function.prototype.getName = function() {23         if ("name" in this) return this.name;24         return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];25     };26     type(NaN);

还可以用jQuery来检测类型,常用的方法如下:

jQuery.isArray(obj);//检测对象是否是数组

1     jQuery.isFunction(obj);//测试对象是否为函数。2     jQuery.isEmptyObject(obj);// jQuery 1.4 中,这个方法既检测对象本身的属性,也检测从原型继承的属性(因此没有使用hasOwnProperty)。3     jQuery.isPlainObject(obj);// 测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)。4     jQuery.isWindow(obj);// 测试对象是否是窗口(有可能是Frame)。5     jQuery.type(obj);// 检测obj的数据类型。6     jQuery.isNumeric(value);// 确定它的参数是否是一个数字,包含16进制数

---恢复内容结束---

 1     /** 2      * 怎么检测一个变量的类型? 3      * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. 4      * 另外还可以适应jQuery来检测类型. 5      * */ 6  7  8     /** 9      * 1.使用typeof检测对象类型10      * typeof作为最常用的检测类型方法,返回字符串类型;11      * */12     function testType(value) {13         var str = typeof(value);14         switch(str){15             case ‘undefined‘: //undefined类型16                 console.log(str);17                 break;18             case ‘object‘: //null类型, 任意内置对象, 数组19                 console.log(str);20                 break;21             case ‘boolean‘: //true, false类型22                 console.log(str);23                 break;24             case ‘string‘: //string字符串类型25                 console.log(str);26                 break;27             case ‘function‘: //任意函数28                 console.log(str);29                 break;30             case ‘number‘://任意的数值类型,包含NaN31                 console.log(str);32                 break;33         }34     }35     testType(111);36     /**37      * 可以看出typeof对于基本类型可以测试出类型,但是对于其他的,包括日期, 数组等等大多都返回object类型,而且null也返回的是object类型,也就是没有办法知道确切类型.38      * */

另一种改进的检测方法, 是使用默认的toString(), 继承自Object,可以返回类型信息.

1     function classof(o){2         if(o === null) return "Null";3         if(o === undefined) return "Undefined";4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型5     }

那为什么不直接用 a.toString() 而要用 Object.prototype.toString.call(a) ?

技术分享

如果是数组或者函数,结果会是怎么样?

技术分享

原因是:直接使用toString()有可能这个方法被重写了, 而不是默认的. 使用Object.prototype.toString().call(o).slice(8,-1);得到的结果更加可靠!

完整代码:

 1 function classof(o){ 2         if(o === null) return "Null"; 3         if(o === undefined) return "Undefined"; 4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型 5     } 6     function testType(value) { 7         var str = classof(value); 8         console.log(str); 9         switch(str){10             case ‘undefined‘: //undefined类型11                 console.log(str);12                 break;13             case ‘object‘: //null类型, 任意内置对象, 数组14                 console.log(str);15                 break;16             case ‘boolean‘: //true, false类型17                 console.log(str);18                 break;19             case ‘string‘: //string字符串类型20                 console.log(str);21                 break;22             case ‘function‘: //任意函数23                 console.log(str);24                 break;25             case ‘number‘://任意的数值类型,包含NaN26                 console.log(str);27                 break;28             case ‘Date‘: //日期29                 console.log(str);30                 break;31             case ‘Array‘: //数组32                 console.log(str);33                 break;34             case ‘RegExp‘: //正则35                 console.log(str);36                 break;37         }38     }39     //testType(function(){console.log(this)});//function40     testType();

可以看到改进了一部分

技术分享

2.使用instanceof检测对象类型

对于typeof()检测为Object类型的可以使用instanceof进一步检测具体类型.instanceof实际上检测的是对象的原型.

可以检测变量是不是某个对象的实例,返回bool值.

1 var value = http://www.mamicode.com/new Date();2 var isDate = value instanceof Date;3 console.log(isDate);//true

3.使用constructor检测对象类型

constructor相当于检测构造函数,返回的是一个函数.

 1     function testconstructor(value) { 2         var str = value.constructor; 3         console.log(value.constructor); 4         switch(str){ 5             case Number: 6                 console.log(str); 7                 break; 8         } 9     }10     testconstructor(111); //function Number()

如果需要检测一个对象的确切类型,可以综合使用这三种方法:

 1 function type(o) { 2         var t, c, n;//type class name 3         //null类型 4         if(o === null) return "null"; 5         //是数值中的特殊类型:NaN 6         if(o !== o) return "nan"; 7         //使用typeof检测除去 "object" 类型为的其他类型. 8         if((t = typeof o) !== "object") return t; 9         //typeof检测为"object"类型,则进一步检测10         //可以检测出大部分内置类型11         if((c = classof(o)) !== "Object") return c;12         //classof(o)返回为"Object"时,检测constructor13         if(o.constructor && typeof o.constructor === "function" && (n = o.constructor.getName())) return n;14         //无法识别的其他类型,默认为"Object"15         return "Object";16     }17     function classof(o) {18         return Object.prototype.toString.call(o).slice(8,-1);19     };20 21     //返回function的名称, 可能为""或者 null22     Function.prototype.getName = function() {23         if ("name" in this) return this.name;24         return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];25     };26     type(NaN);

还可以用jQuery来检测类型,常用的方法如下:

jQuery.isArray(obj);//检测对象是否是数组

1     jQuery.isFunction(obj);//测试对象是否为函数。2     jQuery.isEmptyObject(obj);// jQuery 1.4 中,这个方法既检测对象本身的属性,也检测从原型继承的属性(因此没有使用hasOwnProperty)。3     jQuery.isPlainObject(obj);// 测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)。4     jQuery.isWindow(obj);// 测试对象是否是窗口(有可能是Frame)。5     jQuery.type(obj);// 检测obj的数据类型。6     jQuery.isNumeric(value);// 确定它的参数是否是一个数字,包含16进制数

---恢复内容开始---

 1     /** 2      * 怎么检测一个变量的类型? 3      * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. 4      * 另外还可以适应jQuery来检测类型. 5      * */ 6  7  8     /** 9      * 1.使用typeof检测对象类型10      * typeof作为最常用的检测类型方法,返回字符串类型;11      * */12     function testType(value) {13         var str = typeof(value);14         switch(str){15             case ‘undefined‘: //undefined类型16                 console.log(str);17                 break;18             case ‘object‘: //null类型, 任意内置对象, 数组19                 console.log(str);20                 break;21             case ‘boolean‘: //true, false类型22                 console.log(str);23                 break;24             case ‘string‘: //string字符串类型25                 console.log(str);26                 break;27             case ‘function‘: //任意函数28                 console.log(str);29                 break;30             case ‘number‘://任意的数值类型,包含NaN31                 console.log(str);32                 break;33         }34     }35     testType(111);36     /**37      * 可以看出typeof对于基本类型可以测试出类型,但是对于其他的,包括日期, 数组等等大多都返回object类型,而且null也返回的是object类型,也就是没有办法知道确切类型.38      * */

另一种改进的检测方法, 是使用默认的toString(), 继承自Object,可以返回类型信息.

1     function classof(o){2         if(o === null) return "Null";3         if(o === undefined) return "Undefined";4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型5     }

那为什么不直接用 a.toString() 而要用 Object.prototype.toString.call(a) ?

技术分享

如果是数组或者函数,结果会是怎么样?

技术分享

原因是:直接使用toString()有可能这个方法被重写了, 而不是默认的. 使用Object.prototype.toString().call(o).slice(8,-1);得到的结果更加可靠!

完整代码:

 1 function classof(o){ 2         if(o === null) return "Null"; 3         if(o === undefined) return "Undefined"; 4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型 5     } 6     function testType(value) { 7         var str = classof(value); 8         console.log(str); 9         switch(str){10             case ‘undefined‘: //undefined类型11                 console.log(str);12                 break;13             case ‘object‘: //null类型, 任意内置对象, 数组14                 console.log(str);15                 break;16             case ‘boolean‘: //true, false类型17                 console.log(str);18                 break;19             case ‘string‘: //string字符串类型20                 console.log(str);21                 break;22             case ‘function‘: //任意函数23                 console.log(str);24                 break;25             case ‘number‘://任意的数值类型,包含NaN26                 console.log(str);27                 break;28             case ‘Date‘: //日期29                 console.log(str);30                 break;31             case ‘Array‘: //数组32                 console.log(str);33                 break;34             case ‘RegExp‘: //正则35                 console.log(str);36                 break;37         }38     }39     //testType(function(){console.log(this)});//function40     testType();

可以看到改进了一部分

技术分享

2.使用instanceof检测对象类型

对于typeof()检测为Object类型的可以使用instanceof进一步检测具体类型.instanceof实际上检测的是对象的原型.

可以检测变量是不是某个对象的实例,返回bool值.

1 var value = http://www.mamicode.com/new Date();2 var isDate = value instanceof Date;3 console.log(isDate);//true

3.使用constructor检测对象类型

constructor相当于检测构造函数,返回的是一个函数.

 1     function testconstructor(value) { 2         var str = value.constructor; 3         console.log(value.constructor); 4         switch(str){ 5             case Number: 6                 console.log(str); 7                 break; 8         } 9     }10     testconstructor(111); //function Number()

如果需要检测一个对象的确切类型,可以综合使用这三种方法:

 1 function type(o) { 2         var t, c, n;//type class name 3         //null类型 4         if(o === null) return "null"; 5         //是数值中的特殊类型:NaN 6         if(o !== o) return "nan"; 7         //使用typeof检测除去 "object" 类型为的其他类型. 8         if((t = typeof o) !== "object") return t; 9         //typeof检测为"object"类型,则进一步检测10         //可以检测出大部分内置类型11         if((c = classof(o)) !== "Object") return c;12         //classof(o)返回为"Object"时,检测constructor13         if(o.constructor && typeof o.constructor === "function" && (n = o.constructor.getName())) return n;14         //无法识别的其他类型,默认为"Object"15         return "Object";16     }17     function classof(o) {18         return Object.prototype.toString.call(o).slice(8,-1);19     };20 21     //返回function的名称, 可能为""或者 null22     Function.prototype.getName = function() {23         if ("name" in this) return this.name;24         return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];25     };26     type(NaN);

还可以用jQuery来检测类型,常用的方法如下:

jQuery.isArray(obj);//检测对象是否是数组

1     jQuery.isFunction(obj);//测试对象是否为函数。2     jQuery.isEmptyObject(obj);// jQuery 1.4 中,这个方法既检测对象本身的属性,也检测从原型继承的属性(因此没有使用hasOwnProperty)。3     jQuery.isPlainObject(obj);// 测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)。4     jQuery.isWindow(obj);// 测试对象是否是窗口(有可能是Frame)。5     jQuery.type(obj);// 检测obj的数据类型。6     jQuery.isNumeric(value);// 确定它的参数是否是一个数字,包含16进制数

---恢复内容结束---

 1     /** 2      * 怎么检测一个变量的类型? 3      * 在js中检测对象类型主要有三种:typeof, instanceof, constructor, 这几种都可以检测对象的类型. 4      * 另外还可以适应jQuery来检测类型. 5      * */ 6  7  8     /** 9      * 1.使用typeof检测对象类型10      * typeof作为最常用的检测类型方法,返回字符串类型;11      * */12     function testType(value) {13         var str = typeof(value);14         switch(str){15             case ‘undefined‘: //undefined类型16                 console.log(str);17                 break;18             case ‘object‘: //null类型, 任意内置对象, 数组19                 console.log(str);20                 break;21             case ‘boolean‘: //true, false类型22                 console.log(str);23                 break;24             case ‘string‘: //string字符串类型25                 console.log(str);26                 break;27             case ‘function‘: //任意函数28                 console.log(str);29                 break;30             case ‘number‘://任意的数值类型,包含NaN31                 console.log(str);32                 break;33         }34     }35     testType(111);36     /**37      * 可以看出typeof对于基本类型可以测试出类型,但是对于其他的,包括日期, 数组等等大多都返回object类型,而且null也返回的是object类型,也就是没有办法知道确切类型.38      * */

另一种改进的检测方法, 是使用默认的toString(), 继承自Object,可以返回类型信息.

1     function classof(o){2         if(o === null) return "Null";3         if(o === undefined) return "Undefined";4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型5     }

那为什么不直接用 a.toString() 而要用 Object.prototype.toString.call(a) ?

技术分享

如果是数组或者函数,结果会是怎么样?

技术分享

原因是:直接使用toString()有可能这个方法被重写了, 而不是默认的. 使用Object.prototype.toString().call(o).slice(8,-1);得到的结果更加可靠!

完整代码:

 1 function classof(o){ 2         if(o === null) return "Null"; 3         if(o === undefined) return "Undefined"; 4         return Object.prototype.toString.call(o).slice(8,-1);//获取对象类型 5     } 6     function testType(value) { 7         var str = classof(value); 8         console.log(str); 9         switch(str){10             case ‘undefined‘: //undefined类型11                 console.log(str);12                 break;13             case ‘object‘: //null类型, 任意内置对象, 数组14                 console.log(str);15                 break;16             case ‘boolean‘: //true, false类型17                 console.log(str);18                 break;19             case ‘string‘: //string字符串类型20                 console.log(str);21                 break;22             case ‘function‘: //任意函数23                 console.log(str);24                 break;25             case ‘number‘://任意的数值类型,包含NaN26                 console.log(str);27                 break;28             case ‘Date‘: //日期29                 console.log(str);30                 break;31             case ‘Array‘: //数组32                 console.log(str);33                 break;34             case ‘RegExp‘: //正则35                 console.log(str);36                 break;37         }38     }39     //testType(function(){console.log(this)});//function40     testType();

可以看到改进了一部分

技术分享

2.使用instanceof检测对象类型

对于typeof()检测为Object类型的可以使用instanceof进一步检测具体类型.instanceof实际上检测的是对象的原型.

可以检测变量是不是某个对象的实例,返回bool值.

1 var value = http://www.mamicode.com/new Date();2 var isDate = value instanceof Date;3 console.log(isDate);//true

3.使用constructor检测对象类型

constructor相当于检测构造函数,返回的是一个函数.

 1     function testconstructor(value) { 2         var str = value.constructor; 3         console.log(value.constructor); 4         switch(str){ 5             case Number: 6                 console.log(str); 7                 break; 8         } 9     }10     testconstructor(111); //function Number()

如果需要检测一个对象的确切类型,可以综合使用这三种方法:

 1 function type(o) { 2         var t, c, n;//type class name 3         //null类型 4         if(o === null) return "null"; 5         //是数值中的特殊类型:NaN 6         if(o !== o) return "nan"; 7         //使用typeof检测除去 "object" 类型为的其他类型. 8         if((t = typeof o) !== "object") return t; 9         //typeof检测为"object"类型,则进一步检测10         //可以检测出大部分内置类型11         if((c = classof(o)) !== "Object") return c;12         //classof(o)返回为"Object"时,检测constructor13         if(o.constructor && typeof o.constructor === "function" && (n = o.constructor.getName())) return n;14         //无法识别的其他类型,默认为"Object"15         return "Object";16     }17     function classof(o) {18         return Object.prototype.toString.call(o).slice(8,-1);19     };20 21     //返回function的名称, 可能为""或者 null22     Function.prototype.getName = function() {23         if ("name" in this) return this.name;24         return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];25     };26     type(NaN);

还可以用jQuery来检测类型,常用的方法如下:

jQuery.isArray(obj);//检测对象是否是数组

1     jQuery.isFunction(obj);//测试对象是否为函数。2     jQuery.isEmptyObject(obj);// jQuery 1.4 中,这个方法既检测对象本身的属性,也检测从原型继承的属性(因此没有使用hasOwnProperty)。3     jQuery.isPlainObject(obj);// 测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)。4     jQuery.isWindow(obj);// 测试对象是否是窗口(有可能是Frame)。5     jQuery.type(obj);// 检测obj的数据类型。6     jQuery.isNumeric(value);// 确定它的参数是否是一个数字,包含16进制数

javascript中检测一个变量的类型