在JavaScript中有很多种获取数据类型的方式,不同方式最终实现的效果也会不一样,这里就来简单写一下我知道的几种方式,正好复习一下很早以前学的内容。

typeof

typeof 应该是用的比较多的方式,我刚学JavaScript的时候用的也是 typeof ,用法如下:

var a = 1;  //  number类型
var b = 'abc';  //  string类型

console.log(typeof(a));  //  在控制台输出a的类型
console.log(typeof b);  //  在控制台输出b的类型

无论是 typeof(0) 还是 typeof 0 都能返回数据类型,可能返回的数据类型如下:

类型typeof 返回的类型
number NaNnumber
stringstring
json array nullobject
functionfunction
undefinedundefined

无论是 json 还是 array 返回的都是 object 所以光靠 typeof 是不能分辨 jsonarray 的。

instanceof

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置,可以用来判断对象和数组,如下:

{} instanceof Object  //  结果为 true
[] instanceof Array  //  结果为 true
{} instanceof Array  //  结果为 false

instanceof 比较适合用来判断 objectarray ,不能用来判断 numberstring

Object.prototype.toString.apply

Object.prototype.toString.apply 可以以字符串的方式返回对象类型,如下:

Object.prototype.toString.apply(10);  //  返回 [object Number]

Object.prototype.toString.apply('abc');  //  返回 [object String]

Object.prototype.toString.apply([1, 2]);  //  返回 [object Array]

Object.prototype.toString.apply({"a": "1"});  //  返回 [object Object]

Object.prototype.toString.apply(function() {});  //  返回 [object Function]

Object.prototype.toString.apply(undefined);  //  返回 [object Undefined]

Object.prototype.toString.apply(null);  //  返回 [object Null]

Object.prototype.toString.apply(NaN); //  返回 [object Number]

Object.prototype.toString.apply 相对来说是比较完美的获取数据类型的方式,但是在较老的IE可能会出现兼容性问题,不过现在主流的浏览器都不会出现兼容性问题。

除了上面写的方式外也可以通过某些数据类型独有的方法或属性来判断数据类型,例如可以通过是否有 push 方法来判断是否是数组。

其实上面的几种方式都有对应的应用场景,没有哪一个完美的说法,只有根据不同的场景选择对应的方式才是正确的。