昨天面了阿里一面,有一个检测类型问题,虽然当时给了答案,但是感觉自己还是不够确信,事实的结果是我给的答案有几个的确是错的~~唉~~有道是信誓旦旦不思其反。面试的时候脑子进水~~
1.typeof
• typeof null 返回object,这是因为特殊值null被认为是一个空的对象引用。
• typeof 123 返回number
• typeof NaN 返回number 。NaN,非数值是一个特殊的数值。 这个数值用来表示一个本来要返回数值的操作数未返回数值的情况。
• typeof new Number(123) 返回object, 是一个构造函数Number的实例。
2.instanceof
• 123 instanceof Number 返回false ,因为instanceof 操作符检测基本类型的值都会返回false
• new Number(123) instanceof Number 返回true。
来看instanceof的定义,result = variable instanceof constructor
即如果变量是给定引用类型的实例,那么instanceof操作符就会返回true。显而易见,new Number(123)是Number的一个实例。
• Number(123) instanceof Number 返回false
Number(123)调用Number函数。结果只是 一个数值,是基本数据类型,所以false。
好,面试的这个题分析完毕,但是呢,这种类型检测并不是最优。typeof在一些低版本中检测正则会返回function,而instanceof操作符在存在多个全局作用域时也会问题多多。
这里介绍一个安全的类型检测,object的toString()方法。在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类在内部都会有一个[[class]]属性,这个属性中就知道了上述字符串中的构造函数名。
举个例子
但是toString()方法不能检测非原生构造函数的构造函数名。