要判断一个对象是不是数组的方式有多种,这里我们一个一个来分析:

第一种:采用 Array.isArray()方法(存在兼容性问题)

在使用Array.isArray方法之前,我们先来普及一下它的作用以及如何使用:

                      ① 作用:它是用于判断某个对象是否是数组;

                      ② 使用:语法格式   Array.isArray(对象)

下面我们就用一个小实例来看看它怎么判断一个对象是不是数组:

function Person(name){
        this.name = name;
    }
    var p1 = new Person("张三");    
    console.log(Array.isArray(p1));  //false
    var arr1 =["zhang","li","zhou","wu","zheng","wang"];
    console.log(Array.isArray(arr1)); //true
    console.log("-----------------");
    var arr2 = new Array("abc");
    console.log(Array.isArray(arr2));  //true

从上面的代码我们很容易就可以学到用  Array.isArray()方法来判断,很多人可能觉得,妈呀,太简单了,然鹅.......Array.isArray()  是ES5的新特性,它存在兼容性问题

那如果浏览器不支持ES5的话,上面这种方式和没说一样,接下来我们来分析其他判断数组的方式

 

第二种:判断是否有push或者其他数组的方法(不严谨)

很多人这时候会想到,判断数组自带的方法不就可以了嘛?下面我们来写一段代码分析:

function Dog(){
        this.name="阿黄";
    }
    var dog = new Dog();
    var arr1 = new Array("a","b","c");
    console.log(dog.name);   //阿黄
    console.log(arr1);     //["a", "b", "c"]
    //1 判断 dog 和arr1哪个是数组

    if (typeof dog.push == "function"){
        console.log("dog是数组");
    }
    if (typeof arr1.push =="function"){       //arr1是数组
        console.log("arr1是数组");
    }

    // 2 这样看好像满足了,但是如果我们给dog的原型对象添加一个 push方法,会出现什么现象呢?
    Dog.prototype.push = function(){
        console.log("我是dog的push方法");
    }

    console.log("-----------------------");
    // 3 再来 判断 dog 和arr1哪个是数组
    if (typeof dog.push == "function"){   //会打印 dog是数组
        console.log("dog是数组");
    }
    if (typeof arr1.push =="function"){       //arr1是数组
        console.log("arr1是数组");
    }

如果不懂什么是原型对象的,可以看看我写的什么是原型对象的文章,下面,我还是画图为大家分析一下:

 

检验对象是否是数组 java 判断对象是否为数组_检验对象是否是数组 java

 

分析完了,我们就知道这个方法是不可行的,因为它太不严谨了,要是你这样写,你合作的小伙伴会很不高兴的.....

 

第三种:利用toString()结合call()来实现(终极武器)

像之前一样,我们先来普及一下toString()方法和call()方法:

              Ⅰ. toString()

                        ⅰ.作用:toString() 方法可把一个逻辑值转换为字符串,并返回结果。

都是string类型

调用者.toString()   输出的是 [Object Object],它表示 [类型,构造函数]

                   这里我们用一个例子来说明一下toString()

var arr1 = new Array("a","b","c");
    console.log(arr1.toString());   // a,b,c
    var obj1 = {
        age:12
    }
    console.log(obj1.toString()); //[object Object]

 注意点:这里的arr1.toString() 和  obj1.toString()方法不是同一个方法,

接下来,我们画一个图来分析他们分别来源自哪儿

 

检验对象是否是数组 java 判断对象是否为数组_数组_02

               Ⅱ. call()

                        ⅰ.作用:借用其他对象的方法。

                        ⅱ.用法:被借对象.方法名.call(借用对象)

这里也通过一个小的实例来说明一下 call()方法: 

function Person(){
        this.name ="aa";
    }
    Person.prototype.show = function(){
        this.age = 23;
    }
    function  Boy(){
    }
    var boy = new Boy();

    // 需求:让boy也可以使用show方法来获得年龄属性
    Person.prototype.show.call(boy);
    console.log(boy);

  接下来,我们要判断一个数组,只要证明它的构造函数是Array,即 调用toString可以打印出 [Object  Array];由上面的图可知,我们可以让 arr1 借用 Object.prototype的toString()方法,实现过程如下:

// 首先测试一下借用能否实现
    var arr1 = new Array("a","b","c");
    console.log(arr1.toString());   // a,b,c
    var obj1 = {
        age:12
    }
    console.log(obj1.toString()); //[object Object]

    console.log(Object.prototype.toString.call(arr1));  //[object Array]

    console.log("-----------------------");

    // 做兼容性处理
    // 1 判断浏览器是否支持 Array.isArray方法,如果不支持,那么就给他设置一个Array.isArray方法 ;利用我们自己写的这个方法来判断

    if(Array.isArray != "function"){
        Array.isArray =function(obj){
            return Object.prototype.toString.call(obj) == "[object Array]";
            
            // 注意这里返回的是一个布尔值,传入的参数是数组实例对象
        }
    }

总结: 这里是如何判断数组,其实也可利用这种方式来判断日期类型,大家没事可以尝试着写写。