要判斷一個對象是不是數組的方式有多種,這里我們一個一個來分析:
第一種:采用 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]"; // 注意這里返回的是一個布爾值,傳入的參數是數組實例對象 } }
總結: 這里是如何判斷數組,其實也可利用這種方式來判斷日期類型,大家沒事可以嘗試着寫寫。我的表達能力有限,有些地方可能描述的不夠清楚,有什么改進的地方,大家可以提提意見
