js判断数据类型 – Minoz-那

又是好久没有写博客了,但一直都在坚持写笔记,笔记里的东西还是不拿出来献丑了,自己一个人看就好了,哈哈~

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必须是在当前页面声明,在一个页面中嵌入另一个页面,会影响判断结果。

那么,如何简单而又准确判断数据类型呢?下面方法是我常用的。

 

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

 

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

本文链接:js判断数据类型,转载请注明。



You must enable javascript to see captcha here!

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress

无觅相关文章插件,快速提升流量