谈及JS中的类型判断,最为常见的可能是typeof 和 instanceof。但是这两个方法都存在各自的问题。
typeof
typeof 只返回六种基本类型
- ‘undefined’ --未定义的变量或值
- ‘boolean’ --布尔类型的变量或值
- ‘string’ --字符串类型的变量或值
- ‘number’ --数字类型的变量或值
- ‘object’ --对象类型的变量或值,或者null(这个是js历史遗留问题,将null作为object类型处理)
- ‘function’ --函数类型的变量或值Array作为object 的子类会被识别成Object,而且null也会被识别为object
例如:
Instanceof
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。这意味着,Array对象同样可以通过对与Object的类型检查。
而且如果一个字符串不是用String()构造器初始化的,instanceof不会识别该对象为字符串。
Object.prototype.toString.call()
判断一个变量类型最为合适的方法是——Object.prototype.toString.call()。\对象原型的toString()方法会打印出完整的原型链。比如:Object.prototype.toString(),返回结果是:"[object Object]"。但是Array.prototype.toString() 的返回结果是: ””。因为Array继承作为Object的子类重写了toString()方法。
而且非object变量的tostring()方法都被重写了。也获取不到prototype属性。所以要使用 call() 方法。call() 方法是预定义的 JavaScript 方法。它可以用来调用所有者对象作为参数的方法。通过 call(),能够使用属于另一个对象的方法。
具体使用如下: