js数据类型判断的4方法
typeof
instanceof
constructor
Object.prototype.toString.call()
1. typeof
1.typeof可以检测Number,String,Boolean,Undefined,Function的数据类型,返回对应的数据类型的小写字符。
2.对于利用构造函数创建的Number,String,Boolean都返回object
3.检测null,Array,Date,RegExp都会返回小写的object
console.log(typeof 100); // 'number'
console.log(typeof 'a'); // 'string'
console.log(typeof true); // 'boolean'
console.log(typeof undefined); // 'undefined'
console.log(typeof function(){}); // 'function'
console.log(typeof null); // 'object'
console.log(typeof []); // 'object'
console.log(typeof {}); // 'object'
console.log(typeof new Date()); // 'object'
console.log(typeof /^123$/); // 'object'
console.log(typeof new Number(100));// 'object'
console.log(typeof new String('abc'));// 'string'
console.log(typeof new Boolean(true));//'boolean'
2. instanceof
instanceof运算符需要指定一个构造函数,或者说指定一个特定的类型,它用来判断这个构造函数的原型是否在给定对象的原型链上。
console.log([] instanceof Array); //true
console.log({} instanceof Object); //true
console.log(new Date() instanceof Date);//true
console.log(/^123$/ instanceof RegExp); //true
console.log(function(){} instanceof Function); // true
console.log(new Number(100) instanceof Number); // true
console.log(100 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log('abc' instanceof String); //false
console.log(false instanceof Boolean); //false
console.log(undefined instanceof Object); //false
3.constructor
constructor是prototype对象上的属性,指向构造函数,根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的。
可以检测任何数据类型,除null,undefined,但是有一个隐患,他的指向容易改变。
let a = 10
console.log([].constructor == Array); //true
console.log({}.constructor == Object); //true
console.log(function(){}.constructor == Function); //true
console.log(new Date().constructor == Date); //true
console.log(/^123$/.constructor == RegExp); //true
console.log(new Number(100).constructor == Number);//true
console.log(a.constructor == Number); //true
console.log(true.constructor == Boolean); //true
console.log('1'.constructor == String); //true
console.log(null.constructor); // 报错 没有原型
console.log(undefined.constructor); // 报错
除了undefined和null之外,其他类型都可以通过constructor属性来判断类型。
4. Object.prototype.toString.call()
console.log(Object.prototype.toString.call(123))//"[object Number]"
console.log(Object.prototype.toString.call('123'))//"[object String]"
console.log(Object.prototype.toString.call(true))//"[object String]"
console.log(Object.prototype.toString.call(null))//"[object Null]"
console.log(Object.prototype.toString.call(undefined))//"[object Null]"
console.log(Object.prototype.toString.call([]))//"[object Array]"
console.log(Object.prototype.toString.call({}))//"[object object]"
console.log(Object.prototype.toString.call(/^123$/))//"[object RegExp]"
console.log(Object.prototype.toString.call(new Date()))//"[object Date]"
console.log(Object.prototype.toString.call(function(){}))//"[object Function]"
5.还可以自己封装一个获取变量准确类型的函数
function gettype(obj) {
var type = typeof obj;
if (type !== 'object') {
return type;
}
//如果不是object类型的数据,直接用typeof就能判断出来
//如果是object类型数据,准确判断类型必须使用Object.prototype.toString.call(obj)的方式才能判断
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');
}