存档

文章标签 ‘datatype’

在Javascript中应该如何判断数据类型

2015年5月8日 没有评论

引子


在实际的前端项目中,我们经常需要判断某个数据是否是数组,或者是否是函数,自己之前经常的写法就是instanceof,但是在看美国peer的代码的时候,看到了一个这样的写法Object.prototype.toString.call(x) === ‘[object Array]‘,感觉很奇怪,于是就搜索了一下,就有了这篇博文。

 

为什么不用typeof


初学javascript的话,一定会有这个疑惑,typeof和instanceof,这两货到底有啥区别?实际上typeof的返回值只有六个: undefined, boolean, number, string, function以及object,无法判断数组,但是呢,instanceof就可以,所以很多情况下使用instanceof就可以了。

 

那干嘛不用instanceof


确实在很多情况下,instanceof就可以了,但是呢,如果一个页面包含多个frame的话,这样的判断方法就失效了,我们来看下面这个例子:

v instanceof Array

如果v是来源于另外一个frame的数组对象,那么此时该表达式返回的是false,因为v只是anotherFrame.contentWindow.Array的实例,并不是当前frame的数组的实例。

 

我该用啥


如果是原生的javascript的话,用Object.prototype.toString.call(x) === ‘[object Array]‘类似的语句就可以很好地判断对象的数据类型了。

如果在项目中使用到了underscore或者是lodash’的话,那么恭喜你,你可以使用它们提供的isArray, isNumber, isFunction, isRegExp等方法来判断数据类型。

如果你的项目是nodejs的话,那么你可以使用util这个模块:

var util = require("util");
var a = [];
console.log(util.isArray(a));