又是好久没有写博客了,但一直都在坚持写笔记,笔记里的东西还是不拿出来献丑了,自己一个人看就好了,哈哈~
js中判断数据类型有很多种,今天我就整理一下我所知道的方法。
1.typeof
首先在控制台试试下面的几道小题
typeof null //object typeof undefined // undefined typeof false // boolean typeof 123 // number typeof 'abc' //string
ok,五种基本数据类型,除了null,其他的输出不用解释。
null被认为是一个空对象引用,所以,会返回object,这算是一个语言实现的错误。
再来看下面的例子
typeof new Number(12); //object typeof Number(13) //number typeof NaN // number
此例子还可以用String和Boolean试一下,都是可以的。
解释一下:
第一个虽然Number,String,Boolean是基本数据类型,但他们可以通过new创建,而通过new创建,后台会自动转化为对象,使他们看起来像对象。因此,第一个是返回object
第二个由于没有用new,创建的就是基本数据类型,所以还是number类型
第三个NaN是属于Number类型的,这里需要注意NaN与任何数据都不相等,包括它本身。
再试试用typeof判断引用类型
typeof {} //object typeof /d/ //object typeof [] //object typeof new Date() //object typeof function() {} //function
可见使用typeof除了判断function是精确的,而其他引用型数据都是object,但需要注意的是在有些低版本浏览器,会将正则误判断为function。
因此,又有了instanceof判断引用类型。
2.instanceof
({}) instanceof Object; //以下都为true [] instanceof Array (new Date()) instanceof Date (function() {}) instanceof Function (/d/) instanceof RegExp
恩,很好,完全可以是我们所想要的方法。顺便看看下面的例子:
new Number(12) instanceof Number // true Number(13) instanceof Number // false 123 instanceof Number // false
嘿嘿。不对了吧,这就需要提到instanceof的原理了,instanceof其实是用来判断一个变量是否为某个对象的实例。
解释一下
正如上面说所说,基本数据类型通过使用new创建时,会在后台转化为对象,使他们看起来像对象,
第一个用new创建所以是Number的实例,返回true
第二个只是用Number()创建数字,是基本类型,不是Number的实例
第三个更不用说啦!
还有一种方法是使用constructor
3.constructor
constructor可以返回对象相应的构造函数
[].constructor == Array; //以下都为true {}.constructor == Object; "string".constructor == String; (123).constructor == Number; true.constructor == Boolean;
但是,需要注意的是方法2和方法3必须是在当前页面声明。因为,他们假定都是只有一个全局执行环境的。如果一个页面使用多个框架,那么就存在两个以上的全局执行环境,也就存在两个以上不同版本的Array构造函数。如果当我们使用一个框架向另一个框架传入数组,那么,他们具有不同的构造函数,因此,会影响判断结果。
那么,如何简单而又准确判断数据类型呢?下面方法是我常用的。
4.Object.prototype.toString.call()
Object.prototype.toString.call() === '[object String]' //true 其他类型(包括基本类型)就不一一验证了
调用Obeject原型上的toString方法,该方法获取this对象上的[[Class]]属性,这个属性会返回该对象的类型。
用上面的方法可以较准确的判断数据类型,这也是我经常使用判断引用类型的方法。
以下参考自http://www.cnblogs.com/mofish/p/3388427.html
5.使用特性判断
例如:
function isArray(obj) { return obj && typeof obj === 'object' && typeof obj.length === 'number' && typeof obj.splice === 'function' && !(obj.propertyIsEnumerable('length')); }
有length和splice并不一定是数组,因为可以为对象添加属性,而不能枚举length属性,才是最重要的判断因子。
此外,如果是要判断数组,还可以使用ES5里的方法Array.isArray();
这些是我目前知道的,如果有更好的方法求赐教~~有什么不对的地方求指教~~