方法有如下几种:
- typeof 方法
- object.property.toString.call 方法
- obj instanceof Object 方法
- constructor
来几个列子
var a = "Hello";
var b = 321;
var c= [1,2,3];
var d = new Date();
var e = function(){alert(121);};
var f = function(){this.name="jack";};
一、typeof
基本数据类型除了 null 外都返回对应类型的字符串
console.log(typeof a) //"string"
console.log(typeof b) //"number"
console.log(typeof c) //"object"
console.log(typeof d) //"object"
console.log(typeof e) //"function"
console.log(typeof f) //"function"
console.log(typeof null) //"object"
console.log(typeof undefined) //"undefined"
由此发现,typeof可以判断基本数据类型,但是难以判断除了函数以外的复杂数据类型。
二、object.property.toString.call
它返回"[object, 类型]"。其中基本数据类型都能返回相应的类型。
每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写,返回 [Object 类型]。但当除了 Object 类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以需要使用 call 或 apply 方法来改变 toString 方法的执行上下文。
console.log(Object.prototype.toString.call(a)) //"[object String]"
console.log(Object.prototype.toString.call(b)) //"[object Number]"
console.log(Object.prototype.toString.call(c)) //"[object Array]"
console.log(Object.prototype.toString.call(d)) //"[object Date]"
console.log(Object.prototype.toString.call(e)) //"[object Function]"
console.log(Object.prototype.toString.call(null)) //"[object Null]"
console.log(Object.prototype.toString.call(undefined)) //"[object Undefined]"
由此可见,可以判断所有基本的数据类型,即使是 null 和 defined。但不能精准判断自定义对象,对于自定义对象只会返回 [object Object]。
三、instanceof
它内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
console.log(a instanceof String) // true
console.log(b instanceof Number) // true
console.log(c instanceof Array) // true
console.log(null instanceof Object) // false
instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型 instanceof Object 都是 true。
instanceof 可以判断自定义实例化对象。
function f(value) {
this.value = value
}
var f1 = new f('2222')
console.log(f1 instanceof f) //true