typeof
对于基本数据类型来说,除了null返回的是object,其他都可返回正确的类型。 调用null为空,是因为
- null被认为是一个空对象,因此返回了object
- 因为任何对象都会被转化为二进制,null转为二进制则表示全为0,如果前三个均为0,js就会把它当作是对象,这是js早期遗留下来的bug
所以typeof:
适用于判断(除null)基础类型,判断引用类型,除了function 全返回object类型
instanceof
- 只能用来判断
变量的原型链上是否有构造函数的prototype属性(两个对象是否属于原型链的关系),不一定能获取对象的具体类型 - Instanceof 不适用判断原始类型的值,只能用于判断对象是否从属关系
toString
-
Object.prototype.toString方法返回对象的类型字符串,因此可用来判断一个值的类型。
-
因为实例对象有可能会自定义toString方法,会覆盖Object.prototype.toString,所以在使用时,最好加上call
-
所有的数据类型都可以使用此方法进行检测,且非常精准
constructor
- 原理:
每一个实例对象都可通过constructor来访问它的构造函数,其实也是根据原型链的原理来的。 - 由于undefined和null是无效的对象,因此是没有constructor属性的,这两个值不能用这种方法判断.
总结
-
typeof 适合基本类型和function类型的检测,无法判断null与object
-
instanceof 适合自定义对象,也可以用来检测原生对象,在不同的iframe 和 window间检测时失效,还需要注意Object.create(null)对象的问题
-
constructor 基本能判断所有类型,除了null和undefined,但是constructor容易被修改,也不能跨iframe使用
-
tostring能判断所有类型,可将其封装为全能的DataType()判断所有数据类型