js判断数据类型的几种方法

今天来谈谈判断数据类型的几种方法:

 一、typeof操作符判断数据类型

typeof返回的字符串(能够判断的数据类型)

一、普通对象与函数对象

       Object, Function是Js自带的函数对象

       1. function f1(){ }

       2. var f2 = function(){ }

       3. var f3 = new Function('str', 'console.log(str)');

       4. var o1 = {};

       5. var o2 = new Object();

       6. var o3 = new f1();

  结果如下:

       

因此 typeof 可判断基本的数据类型,但无法判断引用类型(除了function类),也就是继承自object类型的具体类型,比如Array、Date、自定义类等。

二、instanceof操作符判断数据类型

   a istanceof A :判断a是否是A的实例,其实是在判断a._proto_ === A.prototype,所以用这种方法判断数据类型存在一个问题,举例来说:

  1. var arr = [];  
  2. arr instanceof Array     // true  
  3. arr instanceof Object   // true 

  原因:

   arr._proto_ === Array.prototype;  

     Array.prototype._proto_ === Object.prototype;  

   Object.prototype._proto_ === null;  

  基于原型链的查找机制。

  因此,我们用 instanceof 也不能完全精确的判断object类的具体数据类型。

三、Arrary.isArray()方法判断是否为数组

  这是S5中新增的数组方法,用来检测数组类型。但在IE9以下浏览器不支持。可以解决当网页存在多个全局执行环境下用instanceof操作符判断类型的问题。

  var arr = [];  

  Array.isArray(arr);  //true

四、Object.prototype.toString.call()精确判断数据类型

   可以用来精确判断数据类型,包括Boolean、Number、String、Function、Array、Date、RegExp、Object、Error等类型。返回类似’[object type]‘的字符串,

   type指前面提到过的Boolean、String等类型。
   缺点:无法检测开发人员自定义的构造函数创建的实例类型。
   如:

  function Person(name){  

    this.name = name;  

  }  

  var p1 = new Person('san');  

  Object.prototype.toString.call(p1)   //'[object Object]'  

  

posted @ 2017-07-25 11:13  优优66  阅读(914)  评论(0编辑  收藏  举报