前言
js数据类型大致可分为八种,这八种又可以分为两部分 :
1. 基本数据类型 : Number , BigInt(ie不兼容) , String , Boolean , Null , Undefined , Symbol
2. 引用数据类型 : Object (包括Object , Array , Function , Date ... )
常用判断方法
typeof 判断
查看字面量或者变量的数据类型
typeof能判断如下类型 : number , string , boolean , symbol , undefined , function ; 而null , Array , Object 的判断检测结果均为object,因此这三者的鉴别需要进一步判断。
typeof1// 'number'typeof'1'// 'string'typeoftrue// 'boolean'typeof {} // 'object'typeof [] // 'object'typeofnull// 'object'typeofnewDate() // 'object'typeof (() => {}) // 'function'typeofundefined// 'undefined'typeofSymbol(1) // 'symbol'
instanceof 判断 (instanceof - JavaScript | MDN (mozilla.org))
可以检测构造函数(constructor)的prototype属性是否位于实例对象的原型链上 , 一般用于判断自定义的构造函数实例
({}) instanceofObject// true[] instanceofArray// truefunctionFoo() {} constfoo=newFoo(); fooinstanceofFoo// truefooinstanceofObject// trueps:由于是利用对象prototype的constructor进行判断,因此只有对象构造的数据类型变量适用该方法,不适用于非对象类型的变量letstr='string数据类型字符串'; letstrObject=newString('Object构造的string字符串'); strinstanceofString; // falsestrObjectinstanceofString; // true
constructor 判断
能判断如下类型 : Number , String , Boolean , Symbol , Function , Object , Array ; null 和 undefined没有constructor属性,所以不能判断
console.log((1).constructor===Number); // trueconsole.log(''.constructor===String); // trueconsole.log(false.constructor===Boolean); // trueconsole.log([].constructor===Array); // trueconsole.log(({}).constructor===Object); // trueconsole.log((functionfoo() {}).constructor===Function);// trueconsole.log(Symbol('1').constructor===Symbol);// true
Object.prototype.toString 判断
利用基础数据类型都可以通过引用数据类型包装得到的特性,即Object是其他基础数据类型的父类,重写Object的toString方法,用来判断Array, Null等较难判断的数据类型
functionFoo(){}; constfoo=newFoo(); Object.prototype.toString.call(1); // '[object Number]'Object.prototype.toString.call('1'); // '[object String]'Object.prototype.toString.call(true); // '[object Boolean]'Object.prototype.toString.call(undefined); // '[object Undefined]'Object.prototype.toString.call(null); // '[object Null]'Object.prototype.toString.call(Symbol(1)); // '[object Symbol]'Object.prototype.toString.call(Foo); // '[object Function]'Object.prototype.toString.call(foo); // '[object Object]' , 实例化对象属于ObjectObject.prototype.toString.call({}); // '[object Object]'Object.prototype.toString.call([]); // '[object Array]'Object.prototype.toString.call(NaN); // '[object Number]' ,此方法判断NaN也属于Number
判断 Object , Array 的方法
判断 Object 基础对象类型
Object.prototype.toString.call({key : 'value'}) ==='[object Object]'补充:判断空对象functionObj(){ // 1. 利用转换为JSON字符串的方法Obj.prototype.isEmptyJson=function(obj){ returnJSON.stringify(obj)==='{}' } // 2. 利用keys遍历自身非原型属性返回的数组长度进行判断Obj.prototype.isEmptyKeys=function(obj) { returnObject.keys(obj).length===0; } // 3. 利用枚举,逐个检查的方法Obj.prototype.isEmptyIterator=function(obj) { // 有则进入迭代,没有直接返回truefor (varkeyinobj) { returnfalse; } returntrue; } } constobj=newObj() constemptyObject= {} console.log(obj.isEmptyJson(emptyObject)) //trueconsole.log(obj.isEmptyKeys(emptyObject)) //trueconsole.log(obj.isEmptyIterator(emptyObject)) //trueconstnotEmptyObject= {name:'zs'} console.log(obj.isEmptyJson(notEmptyObject)) //falseconsole.log(obj.isEmptyKeys(notEmptyObject)) //falseconsole.log(obj.isEmptyIterator(notEmptyObject)) //false
判断是否为数组Array
functionArr(){ // 1. 利用es6的新方法Array.isArray()Arr.prototype.isArray1=function(arr){ returnArray.isArray(arr) } // 2. 利用instanceof进行判断Arr.prototype.isArray2=function(arr) { returnarrinstanceofArray; } // 3. 利用constructor进行判断Arr.prototype.isArray3=function(arr){ if(arr) returnarr.constructor===Arrayreturnfalse } // 4.利用重写toString方法返回的"[object Array]"进行判断Arr.prototype.isArray4=function(arr) { if(arr) returnObject.prototype.toString.call(arr).indexOf('Array')>-1; returnfalse } } constarr=newArr() constisArr= [] console.log(arr.isArray1(isArr)) //trueconsole.log(arr.isArray2(isArr)) //trueconsole.log(arr.isArray3(isArr)) //trueconsole.log(arr.isArray4(isArr)) //true