要判断一个对象是不是数组的方式有多种,这里我们一个一个来分析:
第一种:采用 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() 方法可把一个逻辑值转换为字符串,并返回结果。
都是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()方法不是同一个方法,
接下来,我们画一个图来分析他们分别来源自哪儿
Ⅱ. 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]";
// 注意这里返回的是一个布尔值,传入的参数是数组实例对象
}
}
总结: 这里是如何判断数组,其实也可利用这种方式来判断日期类型,大家没事可以尝试着写写。