数据类型检测 typeof
用来检测数据类型的运算符
语法:typeof [value]
返回值:首先是一个字符串,字符串中包含了我们需要检测的数据类型
使用typeof有自己的局限性,不能细分出当前的值是数组还是正则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 typeof 12 ; typeof NaN ; typeof '' ; var flag = true ;typeof flag; typeof undefined ; null == undefined ; function fn (n, m ) { if (typeof n === 'undefined' ) { } } typeof null ; typeof {}; typeof function ( ) {}; typeof []; typeof /^$/; typeof 1 >1 ?0 :2 ; typeof (1 >1 ?0 :2 );
instanceof & constructor
instanceof:检测当前对象是否属于某一个类的实例
使用instanceof检测某个值是否是属于某一个数据类型的内置类,从而检测出它是否是这个类型值,使用instanceof可以实现typeof实现不了的对对向类型值得区分检测
【弊端】
基本类型值无法基于它检测
instanceof检测的原理是基于原型链检测的,只要当前类在实例的原型链上,最后返回的结果都是true
constructor:构造函数
获取当前要检测数据值得constructor,判断当前数据是不是某一个数据类型内置类来检测
检测数据类型非常不可靠,因为这个属性经常容易被修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [] instanceof Array ; [] instanceof RegExp ; var num = 12 ;num.toFixed(2 ); var num2 = new Number (12 );num2.toFixed(); typeof num2; num instanceof Number ; num2 instanceof Number ; var ary = [];ary instanceof Array ; ary instanceof Object ; function Fn ( ) {}Fn.prototype = new Array (); var f = new Fn();f instanceof Array ; ary.constructor === Array ; ary.constructor === RegExp ; ary.constructor === Object ;
Object.prototype.toString.call([value])
获取Object.prototype上的toString()方法,让发发中的this变为需要检测的数据类型值,并且执行这个方法
在Number/String/Boolean/Array/Function/Regexp…这些类的原型上都有一个toString方法,这个方法就是把本身的值转换为字符串
在Object这个类的原型上也有一个方法toString
,但是这个方法并不是把值转换为字符串,而是返回当前值所属类的详细信息,固定结构:[object 所属的类]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 (12 ).toString(); (true ).toString(); [12 ,23 ].toString(); var obj = {name : 'aa' };obj.toString(); Object .prototype.toString.call(12 ); Object .prototype.toString.call(true ); Object .prototype.toString.call('' ); Object .prototype.toString.call(null ); Object .prototype.toString.call(undefined ); Object .prototype.toString.call([]); Object .prototype.toString.call({}); Object .prototype.toString.call(/^$/ ); Object .prototype.toString.call(function ( ) {}); Object .prototype.toString.call(Math ); Object .prototype.toString.call(document .body); Object .prototype.toString.call(document );
使用toString
检测数据类型,不管你是什么类型值,我们都可以正常检测出需要的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ~function ( ) { var obj = { isNumber: 'Number' , isString: 'String' , isBoolean: 'Boolean' , isNull: 'Null' , isUndefined: 'Undefined' , isPlanObject: 'Obejct' , isArray: 'Array' , isRegExp: 'RegExp' , isFunction: 'Function' }; var check = {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { var value = obj[key]; check[key] = (function (classValue ) { return function (val ) { return new RegExp ('\\[object ' + classValue +'\\]' ).test(Object .prototype.toString.call(val)); } })(obj[key]); } } window .check = check; }();