前言:ECMAScript有5中简单数据类型(也称为基本数据类型):Undefined,Null,Boolean,Number和String。还有一种复杂数据类型:object 。而用typeof操作符去分辨这些数据类型是件很让人奔溃的事情。
一、typeof检测数据
var obj = {}; var str = 'string'; var num = 123; var bool = true; var arr = []; var reg = /a-z/; var fn = function(){}; var obj_null = null; var undf = undefined; console.log(typeof obj); //object console.log(typeof str); //string console.log(typeof num); //number console.log(typeof bool); //boolean console.log(typeof arr); //object console.log(typeof reg); //object console.log(typeof fn); //function console.log(typeof obj_null); //object console.log(typeof obj_undf); //undefined
这时,除了对象输出的是'object'外,还有数组输出的也是'object',正则reg输出的也是'object',null输出的也是'object'。
二、检测new创建数据类型
var obj2 = new Object(); var obj_str = new String('string'); var obj_num = new Number(); var obj_bool = new Boolean(); var obj_arr = new Array(); var obj_reg = new RegExp(); var obj_fn = new Function(); var obj_date = new Date(); console.log(typeof obj2); //object console.log(typeof obj_str); //object console.log(typeof obj_num); //object console.log(typeof obj_bool); //object console.log(typeof obj_arr); //object console.log(typeof obj_reg); //object console.log(typeof obj_fn); //function console.log(typeof obj_date); //object
这时,除了obj_fn,即通过new Funciton()创建的输出的是'function'外,其他输出的全是'object'。这令人很头疼。
三、封装可以分辨所有数据类型的方法
var typeName = { '[object Function]': 'function', '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Object]': 'object', '[object RegExp]': 'regExp', '[object Array]': 'array', '[object Error]': 'error', '[object Date]' : 'date' }; var toStringFn = Object.prototype.toString; //获取到对象的toString方法 //通过call 引用toString方法。 function checkType(obj){ if( obj == null ){ return String( obj ); //js自带的的String方法,用于检测null和undefined } //safari5及之前版本,Chrome7, typeof RegExp返回的是function return typeof obj ==='object' || typeof obj === "function" ? typeName[toStringFn.call(obj)]:typeof obj; }
用checkType检测数据类型
var obj = {}; var str = 'string'; var num = 123; var bool = true; var arr = []; var reg = /a-z/; var fn = function(){}; var obj_null = null; var undf = undefined; var obj2 = new Object(); var obj_str = new String('string'); var obj_num = new Number(); var obj_bool = new Boolean(); var obj_arr = new Array(); var obj_reg = new RegExp(); var obj_fn = new Function(); var obj_date = new Date(); console.log(checkType(obj)); //object console.log(checkType(str)); //string console.log(checkType(num)); //number console.log(checkType(bool)); //boolean console.log(checkType(arr)); //array console.log(checkType(reg)); //regExp console.log(checkType(fn)); //function console.log(checkType(obj_null)); //null console.log(checkType(obj_undf)); //undefined console.log('-----------------------分界线'); console.log(checkType(obj2)); //object console.log(checkType(obj_str)); //string console.log(checkType(obj_num)); //number console.log(checkType(obj_bool)); //boolean console.log(checkType(obj_arr)); //array console.log(checkType(obj_reg)); //regExp console.log(checkType(obj_fn)); //function console.log(checkType(obj_date)); //date
这时就可以清晰的检测所有的数据类型了。
相关链接: