在JavaScript中,数据的类型检测问题是一个非常常见的问题,现在总结一下,总的来说,有如下方法:typeof、instanceof、Object.prototype.toString、constructor。
一、typeof
这个方法是最基本的方法,可以满足一般的类型判断需要,用法如下:
typeof 123 //"number"
typeof NaN //"number"
typeof "adb" //"string"
typeof undefined //"undefined"
typeof function(){} // "function"
typeof null //"object"
typeof [] //"object"
typeof new Object() //"object"
如上所述,typeof无法区分 null、数组、对象。因为对它们的运算的结果均为 “object”,我们可以使用instanceof方法来区分。
二、instanceof
这个方法用于判断一个变量是否是某个对象的实例,如 var a= new Array(),则 a instanceof Array 的值为true。 而var obj = new Object();obj instanceof Object 的值为false,这样我们就区分出了 对象和数组了,但是 应该知道 a instanceof Object 的值也为true 因为 Array是继承自Object.prototype 的。
instanceof 还有一个问题,在不同window或 iframe间的对象类型检测是不行的,例如 在一个iframe中var arr = new Array(),在另一个iframe中 arr instanceof Array的值为是false,而不是true。 那怎么办呢,我们可以使用 Object.prototype.toString 方法。
三、Object.prototype.toString
这个方法可以有效地用于判断一个数据的类型,它的用法如下:
Object.prototype.toString.apply(123) === "[object Number]"
Object.prototype.toString.apply("abc") === "[object String]"
Object.prototype.toString.apply(undefined) === "[object Undefined]"
Object.prototype.toString.apply(true) === "[object Boolean]"
Object.prototype.toString.apply({}) === "[object Object]"
Object.prototype.toString.apply([]) === "[object Array]"
Object.prototype.toString.apply(function(){}) === "[object Function]"
Object.prototype.toString.apply(null) === "[object NUll]"
如上所述,这个方法几乎是完美的,所有不同的数据类型返回的结果都是不一样的,这可以彻底解决数据类型的判断问题,但是有一点要注意,就是在IE6/7/8中,
Object.prototype.toString.apply(null)的结果是 [object Object]。
四、constructor 方法
我们知道构造函数的原型对象中,有一个constructor属性,它的值就是构造函数的名字,例如,new foo(){},var obj = new foo,则 obj.consrructor===foo。我们可以通过这个方法来判断 obj就是 foo的一个实例。这个方法一般用于判断一个对象是谁的实例。对于判断非对象类型就不能用了。