JS中数据类型检测的方式
1、typeof
console.log(typeof ""); // string
console.log(typeof 1); // number
console.log(typeof true); // boolean
console.log(typeof null); // object
console.log(typeof undefined); // undefined
console.log(typeof []); // object
console.log(typeof function() {}); // function
console.log(typeof {}); // object
(1)typeof用于基本数据类型判断是没有问题的;
(2)但是遇到引⽤数据类型(如:Array)是不起作⽤的;
(3)对于对象、null类型的数据都返回的是对象,无法具体区分;
2、instanceof
console.log("1" instanceof String); // false
console.log(1 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log(null instanceof Null); // Null is not defined
console.log(undefined instanceof Undefined); // Undefined is not defined
console.log([] instanceof Array); // true
console.log(function() {} instanceof Function); // true
console.log({} instanceof Object); // true
(1)不可以判断基本数据类型
(2)可以判断引⽤数据类型
(3)如果通过new关键字去创建基本数据类型,这时就会输出true,如下:
console.log(new String("1") instanceof String); // true
console.log(new Number(1) instanceof Number); //true
console.log(new Boolean(true) instanceof Boolean); //true
(4)不能判断null和undefined
3、constructor
console.log("1".constructor === String); // true
console.log((1).constructor === Number); // true
console.log(true.constructor === Boolean); // true
console.log([].constructor === Array); // true
console.log(function() {}.constructor === Function); // true
console.log({}.constructor === Object); // true
console.log((null).constructor === Null); // Cannot read property 'constructor' of null at <anonymous>:1:20
console.log((undefined).constructor === Undefined); // Cannot read property 'constructor' of undefined at <anonymous>:2:25
(1)null和undefined 还是不能判断
(2)其余的,constructor 似乎完全可以应对基本数据类型和引⽤数据类型,都能检测出数据类型
(3)事实上并不是如此,来看看为什么:
function Fn() {}
Fn.prototype = new Array();
var f = new Fn();.
console.log(f.constructor === Fn); // false
console.log(f.constructor === Array); // true
声明了⼀个构造函数,并且把它的原型指向了Array的原型,所以这种情况下不行。
4、Object.prototype.toString.call()
var a = Object.prototype.toString;
console.log(a.call("aaa")); // [object String]
console.log(a.call(1)); // [object Number]
console.log(a.call(true)); // [object Boolean]
console.log(a.call(null)); // [object Null]
console.log(a.call(undefined)); // [object Undefined]
console.log(a.call([])); // [object Array]
console.log(a.call(function() {})); // [object Function]
console.log(a.call({})); // [object Object]
(1)jQuery实际上就是采⽤这个⽅法进⾏数据类型检测的
(2)可以检测所有的数据类型,包括null和undefined