首页 > 代码库 > 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中检测一个变量的类型