1.typeof既可以判断基本数据类型也可以判断引用数据类型
console.log(typeof 1); //number
console.log(typeof 'hello'); //string
console.log(typeof true); //boolean
console.log(typeof undefined); //undefined
console.log(typeof function () { }); //function
console.log(typeof []); //object
console.log(typeof {}); //object
console.log(typeof null); //object
2.instanceof:用来判断一个实例是否属于某种类型,如果是返回true,否则返回false,利用的是原型链中的如果一个实例的原型链中出现过相应的构造函数则返回true,否则返回false
var dog = new Array()
console.log(dog instanceof Array); //true
console.log(dog instanceof Object); //true
3.constructor:typeof不能判断出复杂的数据类型的具体类型是什么,而constructor就可以,constroctor也可以判断日期对象,数学对象的数据类型,但是不能用于判断null和undefined的,因为null的返回值是null,undefined的返回值是undefined(原理:在原型链中,每一个构造函数都有一个prototype,prototype中又会有一个constructor属性指向构造函数,每一个实例都可以使用原型中的constructor属性,每一个实例都有一个指针指向prototype)
let a = 1
console.log(a.constructor); //[Function: Number]
let b = 'a'
console.log(b.constructor); //[Function: String]
let c = true
console.log(c.constructor); //[Function: Boolean]
let d = {}
console.log(d.constructor); //[Function: Object]
let e = []
console.log(e.constructor); //[Function: Array]
// let f = null
// console.log(null.constructor); //报错
// console.log(undefined.constructor); //报错
4.Object.prototype.toString.call()返回调用者的具体类型
console.log(Object.prototype.toString.call(1)); //[object Number]
console.log(Object.prototype.toString.call('a')); //[object String]
console.log(Object.prototype.toString.call(null)); //[object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call({}));//[object Object]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(function () { }));//[object Function]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
从原型链的角度上说,所有的对象都能访问到Object原型上的toString()方法,但是很多的对象的toString()方法都被重写了,不再具有原本的功能,为了保证每个对象都能通过Object.prototype.toString()的检测所以调用call()来将Object.prototype.toString()给到调用者