判断数据类型
在JS中有这几种方法来判断数据类型:typeof、instanceof、Object.prototype.toString.call()、constructor
1、typeof
typeof 对于简单数据类型(undefined、null、boolean、number 、string )可以判断的出来,但是对于复杂数据类型就不起作用(Array),因为对于复杂数据类型的判断结果也是object,跟null的判断返回结果相同,因此这个时候判断不出来是复杂数据类型还是null简单数据类型,返回值为该值的数据类型(undefined、null(object)、boolean、number 、string )
var o = new Array();
console.log(typeof 1);//number
console.log(typeof 'xiaoming');//string
console.log(typeof true);//boolean
console.log(typeof undefined);//undefined
console.log(typeof null);//object
console.log(typeof o);//object
2、instanceof
instanceof可以判断对象是不是另一个对象实例,主要作用是来判断复杂数据类型的,返回值为布尔值;
console.log([] instanceof Array);//true
console.log({} instanceof Object);//true
console.log(function(){} instanceof Function);//true
instanceof也可以判断简单数据类型,但是简单数据类型不能以字面量的形式创建,否则返回值为false;如果通过new关键字去创建简单数据类型,则返回值为true;null和undefined这两个比较特殊,浏览器对这两个不是很友好。
console.log(1 instanceof Number);//false
console.log('xiaoming' instanceof String);//false
console.log(true instanceof Boolean);//false
console.log('--------------------------------');
console.log(new Number(1) instanceof Number);//true
console.log(new String('xiaoming') instanceof String);//true
console.log(new Boolean(true) instanceof Boolean);//true
当简单数据类型(字符串)通过Object构造函数创建变量时,自动创建String实例,赋值给变量后销毁,相当于通过new关键字去创建简单数据类型;
var str=new Object('hello world');
console.log(str instanceof String);//true
console.log(str instanceof Object);//true
3、Object.prototype.toString.call()
Object.prototype.toString.call()能够准确的判断所有的数据类型;
var a = Object.prototype.toString;
console.log(a.call("xiaoming"));//String
console.log(a.call(1));//Number
console.log(a.call(true));//Boolean
console.log(a.call(null));//Null
console.log(a.call(undefined));//Undefined
console.log(a.call([]));//Array
console.log(a.call(function () { }));//Function
console.log(a.call({}));//Object
4、constructor
constructor也能够判断多种数据类型,这里跟instanceof一样,null和undefined除外;
console.log(("xiaoming").constructor === String);//true
console.log((1).constructor === Number);//true
console.log((true).constructor === Boolean);//true
//console.log((null).constructor === Null);
//console.log((undefined).constructor === Undefined);
console.log(([]).constructor === Array);//true
console.log((function () { }).constructor === Function);//true
console.log(({}).constructor === Object);//true
但是有时候constructor也会出现问题,声明了一个构造函数,并且把他的原型指向了Array的原型,这个时候constructor就无能为力了:
function Fun() { };
Fun.prototype = new Array();
//Fun.prototype.constructor = Fun;应该把Fun构造函数的constructor重新指回Fun
var f = new Fun();
console.log(f.constructor === Fun);//false
console.log(f.constructor === Array);//true
console.log(f.__proto__);//[]