js中的数据类型
js中的数据类型大致可以分为以下几种:
- 基本类型:number、 string、 boolean
- 特殊类型:undefined、 null
- 引用类型:Object、 Function、 Date、 Array 等等
下面介绍js中提供的三种判断数据类型的方法
typeof
typeof 返回一个表示数据类型的字符串,返回值有 number、 string、 boolean、 undefined、 object、 function 这6种
从上面的结果中可以看出 typeof 可以正确判断出基本类型,但是对于 null、Date、Array 等都是返回 object,不能得到具体的类型,使用的时候需要特别注意
instanceof
instanceof检测的是原型,可以判断 a 是否为 b 的实例, 使用方式为:a instanceof b
,其内部执行过程如下
如果 a 的 __proto__ 指向 b 的 prototype 时,就认为 a 是 b 的实例
从上面的代码可以看出,instanceof 能够判断出 [] 是 Array 的实例,但也认为 [] 是 Object 的实例,这是为什么呢?
看下面的代码就明白了
从 [] -> Array -> Object -> null 这四者构成了一条原型链,[] 的 __proto__ 直接指向 Array.prototype,间接指向 Object.prototype,所以 [] 也是 Object 的实例,类似new Date()、new Car() 也会形成一条这样的原型链,因此,instanceof 只能用来判断两个对象是否属于原型链的关系,而不能获得对象的具体类型
Object.prototype.toString
可以通过 toString() 来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString() 来检测(这是因为大部分对象都实现了自身的 toString 方法,如果通过 [1, 2].toString() 这种方式来调用的话,是无法获取到具体类型的),需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,把需要检测的对象作为第一个参数传入
通过上面的代码可以看出 Object.prototype.toString 基本能够准确的获取到所有对象的具体类型,事实上 jQuery 中的 type() 方法也是通过这种方式来实现的
jQuery 中 type() 方法实现源码
jQuery 中 type 方法实现源码,