js判断数据类型

又是很久没有写博客了,但一直都在坚持写笔记,笔记里的东西仍是不拿出来献丑了,本身一我的看就行了,哈哈~html

js中判断数据类型有不少种,今天我就整理一下我所知道的方法。数组

 

1.typeof浏览器

首先在控制台试试下面的几道小题框架

typeof null //object
typeof undefined // undefined
typeof false // boolean
typeof 123 // number
typeof 'abc' //string

ok,五种基本数据类型,除了null,其余的输出不用解释。函数

null被认为是一个空对象引用,因此,会返回object,这算是一个语言实现的错误。this

再来看下面的例子spa

typeof new Number(12); //object
typeof Number(13) //number
typeof NaN // number

此例子还能够用String和Boolean试一下,都是能够的。prototype

解释一下:
    第一个虽然Number,String,Boolean是基本数据类型,但他们能够经过new建立,而经过new建立,后台会自动转化为对象,使他们看起来像对象。所以,第一个是返回object
    第二个因为没有用new,建立的就是基本数据类型,因此仍是number类型
    第三个NaN是属于Number类型的,这里须要注意NaN与任何数据都不相等,包括它自己。code

再试试用typeof判断引用类型htm

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();

 

这些是我目前知道的,若是有更好的方法求赐教~~有什么不对的地方求指教~~

相关文章
相关标签/搜索