JS中的数据类型有8种,可分为基本数据类型和引用数据类型
- 基本数据类型:string number boolean null undefined
- 引用数据类型:Array Object function
typeof 判断数据类型
console.log(typeof 1);//number
console.log(typeof 's');//string
缺点是无法判断引用数据类型(除了function)和null对象所属的具体类别,如:
console.log(typeof null);//object
console.log(typeof {});//object
console.log(typeof []);//object
针对这个问题,我们可以使用Object.prototype.toString.call(obj)来判断数据的具体类型,弥补typeof方法的不足
Object.prototype.toString.call(obj)
这句代码的意思是obj对象去调用Object原型对象上的toString方法,输出结果为"[Object type]",type表示obj所属的具体类型
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call([]));//[object Array]
可以看到typeof的问题已经被很好的解决了,但是具体的对象实例也有toString()方法,为什么我们不直接这样写obj.toString()调用对象中的toString方法,而是写成这种形式
Object.prototype.toString.call(obj)是用Object原型对象中的toString方法。我们想看一下obj.toString()的输出结果:
console.log("jerry".toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
可以看到这种调用方式均输出的是数据的字符串形式,可以推断出Array Number等数据类型作为Object的实例均重写了Object的原型对象中的toString方法,因此这两种代码输出的结果不一致,要想得到数据的具体类型,我们需要使用Object的原型对象中的toString方法
instanceof
检测一个实例属于哪个父类型,原理是:实例对象的proto属性==构造函数的prototype,如果相等,则说明构造函数的原型在实例对象的原型链上
function Person(){};
var p =new Person();
console.log(p instanceof Person);//true