要判断一个对象是不是数组的方式有多种,这里我们一个一个来分析:
第一种:采用 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是数组"); }
如果不懂什么是原型对象的,可以看看我写的什么是原型对象的文章,下面,我还是画图为大家分析一下:
分析完了,我们就知道这个方法是不可行的,因为它太不严谨了,要是你这样写,你合作的小伙伴会很不高兴的.....
第三种:利用toString()结合call()来实现(终极武器)
像之前一样,我们先来普及一下toString()方法和call()方法:
Ⅰ. toString()
ⅰ.作用:toString() 方法可把一个逻辑值转换为字符串,并返回结果。
❶ 如果调用toString的是 非 Object类型的对象 typeof 调用者.toString() 都是string类型
❷ 如果调用toString的是 Object构造函数创建的实例对象 调用者.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()方法不是同一个方法,
接下来,我们画一个图来分析他们分别来源自哪儿
Ⅱ. 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]"; // 注意这里返回的是一个布尔值,传入的参数是数组实例对象 } }
总结: 这里是如何判断数组,其实也可利用这种方式来判断日期类型,大家没事可以尝试着写写。我的表达能力有限,有些地方可能描述的不够清楚,有什么改进的地方,大家可以提提意见