1、typeof
typeof 1;//number
typeof '1';//string
typeof true;//boolean
typeof undefined;//undefined
2: toString 这个是最完美的
Object.prototype.toString.call()
toString()方法是Object原型上的方法,调用此方法,返回格式为[object,xxx],xxx即为判断的结果。对于Object对象可以直接调用Object.prototype.toString(),对于其他数据类型,需要通过.call()来调用
Object.prototype.toString({});//[object Object]
Object.prototype.toString.call('');//[object String]
Object.prototype.toString.call({}).replace(/\[object\s|\]/g, '') // String
Object.prototype.toString.call(1);//[object Number]
Object.prototype.toString.call(true);//[object Boolean]
Object.prototype.toString.call(undefined);//[object Undefined]
Object.prototype.toString.call(null);//[object Null]
Object.prototype.toString.call(Symbol());//[object Symbol]
Object.prototype.toString.call(new Error());//[object Error]
3: instanceof:
- 表达为A instanceof B,是用来判断 A 是否为 B 的实例,返回一个布尔值。
- instanceof 的原理是通过A对象的原型链上是否含有B类型的原型。
[] instanceof Object; //true
fn instanceof Function;//true
由上图可以看出[]的原型指向Array.prototype,间接指向Object.prototype, 因此 [] instanceof Array 返回true, [] instanceof Object 也返回true。
4: constructor
JS规定每个构造函数都有一个prototype属性 ,即为构造函数的原型对象,而原型对象上会有一个constructor属性指回到构造函数,当利用构造函数创建对象时,原型上的constructor属性也会被继承到该新创建的对象上,从原型链的角度看,构造函数也代表了对象的类型
new Number(1).constructor == Number; //true
new String(1).constructor == String; //true
true.constructor == Boolean; //true
new Object().constructor == Object; //true
new Error().constructor == Error; //true
延展知识:
判断是否是数组的另外2种方式
[]._proto_ == Array.prototype
Array.isArray([]) es5