1、typeof (返回值为数据类型)
1 console.log(typeof ""); 2 console.log(typeof 1); 3 console.log(typeof true); 4 console.log(typeof null); 5 console.log(typeof undefined); 6 console.log(typeof []); 7 console.log(typeof function(){}); 8 console.log(typeof {});
控制台输出:string,number,boolean,object,undefined,object,function,object
总结,当需要判断数据类型是否为数组或者null时,不能用typeof
2、instanceof (返回值为布尔值,true,false)
1 console.log("1" instanceof String); //false 2 console.log(1 instanceof Number); //false 3 console.log(true instanceof Boolean); //false 4 console.log(null instanceof Null); 5 console.log(undefined instanceof Undefined); 6 console.log([] instanceof Array); //true 7 console.log(function(){} instanceof Function); / true 8 console.log({} instanceof Object); //true
总结,instanceof只能检测出数组,方法,对象
typeof与instanof比较,得出,检测一个变量的类型是否是数组时,用 XX instanceof Array检测,其余的类型都可以用typeof检测
3.constructor
1 console.log(("1").constructor === String); 2 console.log((1).constructor === Number); 3 console.log((true).constructor === Boolean); 4console.log(([]).constructor === Array); 5 console.log((function() {}).constructor === Function); 6 console.log(({}).constructor === Object);
全部输出结果都为true
乍一看,constructor似乎完全可以应对基本数据类型和引用数据类型,都能检测出数据类型,事实上并不是如此,来看看为什么:
1 function Fn(){}; 2 3 Fn.prototype=new Array(); 4 5 var f=new Fn(); 6 7 console.log(f.constructor===Fn); 8 console.log(f.constructor===Array);
我声明了一个构造函数,并且把他的原型指向了Array的原型,所以这种情况下,constructor也显得力不从心了。
看到这里,是不是觉得绝望了。没关系,终极解决办法就是第四种办法,看过jQuery源码的人都知道,jQuery实际上就是采用这个方法进行数据类型检测的。
4、Object.prototype.toString.call()
1 var a = Object.prototype.toString; 2 3 console.log(a.call("aaa")); 4 console.log(a.call(1)); 5 console.log(a.call(true)); 6 console.log(a.call(null)); 7 console.log(a.call(undefined)); 8 console.log(a.call([])); 9 console.log(a.call(function() {})); 10 console.log(a.call({}));
可以看到,所有的数据类型,这个办法都可以判断出来。那就有人质疑了,假如我把他的原型改动一下呢?如你所愿,我们看一下: