1.typeof
用 typeof 方式进行数据检测,除了数组、对象、null 会被判断为 object 之外,其它的数据类型都能够检测正确。
console.log(typeof undefined); // undefined
console.log(typeof 2); // number
console.log(typeof 'abc'); // string
console.log(typeof false); // boolean
console.log(typeof function(){}); // function
console.log(typeof {}); // object
console.log(typeof []); // object
console.log(typeof null); // object
2.instanceof
instanceof 只能正确判断出引用数据类型,对基本数据类型不能做出正确的判断。其判断原理是判断数据类型的原型链中能否找到该类型的原型。
console.log(2 instanceof Number); // flase
console.log('abc' instanceof String); // flase
console.log(true instanceof Boolean); // flase
console.log(function(){} instanceof Function); // true
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
3.constructor
constructor 有两个作用,一是判断数据的类型,二是实例对象通过 constructor 可以访问它的构造函数。
console.log( (1).constructor === Number ); // true
console.log( ('str').constructor === String ); // true
console.log( (false).constructor === Boolean ); // true
console.log( ([]).constructor === Array ); // true
console.log( (function(){}).constructor === Function ); // true
console.log( ({}).constructor === Object ); // true
但是如果改变了一个实例对象的原型,就不能进行数据类型的判断。
function Fn(){}
Fn.prototype = new Array()
var fn = new Fn()
console.log(fn.constructor === Array); // true
console.log(fn.constructor === Fn); // false
4.Object.prototype.toString.call()
var judge = Object.prototype.toString
console.log(judge.call(2)); // [object Number]
console.log(judge.call('abc')); // [object String]
console.log(judge.call(false)); // [object Boolean]
console.log(judge.call(undefined)); // [object Undefined]
console.log(judge.call(null)); // [object Null]
console.log(judge.call(function(){})); // [object Function]
console.log(judge.call([])); // [object Array]
console.log(judge.call({})); // [object Object]
注意:直接调用 toString 方法是将别的类型转换成 String ,但是通过原型去调用 toString 方法与其结果不一样。这是因为在实例对象上对 toString 方法进行了重写,所以会调用自身上面 toString 方法,不会去原型链上进行调用。