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'://任意的数值类型,包含NaN
31                 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'://任意的数值类型,包含NaN
26                 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)});//function
40     testType();

可以看到改进了一部分

2.使用instanceof检测对象类型

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

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

1 var value = 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"时,检测constructor
13         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的名称, 可能为""或者 null
22     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'://任意的数值类型,包含NaN
31                 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'://任意的数值类型,包含NaN
26                 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)});//function
40     testType();

可以看到改进了一部分

2.使用instanceof检测对象类型

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

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

1 var value = 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"时,检测constructor
13         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的名称, 可能为""或者 null
22     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'://任意的数值类型,包含NaN
31                 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'://任意的数值类型,包含NaN
26                 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)});//function
40     testType();

可以看到改进了一部分

2.使用instanceof检测对象类型

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

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

1 var value = 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"时,检测constructor
13         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的名称, 可能为""或者 null
22     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'://任意的数值类型,包含NaN
31                 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'://任意的数值类型,包含NaN
26                 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)});//function
40     testType();

可以看到改进了一部分

2.使用instanceof检测对象类型

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

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

1 var value = 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"时,检测constructor
13         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的名称, 可能为""或者 null
22     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进制数
posted @ 2016-09-01 13:13  SkyTeam_LBM  阅读(493)  评论(0编辑  收藏  举报