判断数据类型

1、toString()

 1 var arr = [1,2,3];
 2 console.log(arr.toString());//1,2,3
 3 
 4 var bo = true;
 5 console.log(bo.toString());//true
 6 
 7 var date = new Date();
 8 console.log(date.toString());//Fri Nov 17 2017 15:18:18 GMT+0800 (中国标准时间)
 9 
10 var m = function(){
11     return false;
12 }
13 console.log(m.toString());//function (){return false;}
14 
15 var num = 123;
16 console.log(num.toString());//123
17 
18 var s = "abc";
19 console.log(s.toString());//abc
20 
21 var a={"name":"zhangsan"};
22 console.log(a.toString());//[object Object]
23 
24 console.log(typeof(arr));//object
25 console.log(typeof(null));//object
26 console.log(typeof(a));//object
27 console.log(Object.prototype.toString.call(arr));//[object Array]
28 console.log(Object.prototype.toString.call(null));//[object Null]
29 console.log(Object.prototype.toString.call(a));//[object Object]

通过上面例子我们则可以看到toString()为何能区分数组,null以及对象。typeof对数组,null以及对象判断的结果都是object,所以区分它们三者的一种办法即使用Object的原型上的方法toString

此处加一知识点:call和apply。

call和apply都可以改变this的指向,apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。call和apply不同的是——apply()把参数打包成Array再传入;call()把参数按顺序传入;

比如调用Math.max(3, 5, 4),分别用apply()call()实现如下:

Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5

对普通函数调用,我们通常把this绑定为null

所以Object.prototype.toString.call(arr))是将this指定到这个arr上了。

下面系统说一下判断数据是否为数组的方法:

2、数组的判断

法一:

function isArray(obj){
    if(Array.isArray){
        return Array.isArray(obj);
    }else{
        return Object.prototype.toString.call(obj)==="[object Array]";
    }
}

法二:

Array.isArray(obj);   //obj是待检测的对象 

法三:

  • 通过instanceof运算符来判断

注意:instanceof运算符左边是子对象(待测对象),右边是父构造函数(这里是Array),

即:子对象 instanceof  父构造函数 

instance: 实例:凡是用new 构造函数()创建出的对象,都称为是构造函数的实例

arr instanceof Array

法四:

  • 使用isPrototypeOf()函数

原理:检测一个对象是否是Array的原型(或处于原型链中,不但可检测直接父对象,还可检测整个原型链上的所有父对象)

使用方法: parent.isPrototypeOf(child)来检测parent是否为child的原型;

需注意的是isPrototypeOf()函数实现的功能和instancof运算符非常类似;

Array.prototype.isPrototypeOf(arr) //true表示是数组,false不是数组 

法五:

利用构造函数constructor

obj.constructor == Array
原文地址:https://www.cnblogs.com/gtlm/p/7852111.html