1. 不能用typeof ,因為typeof?只能判斷基本類型,不能判斷引用類型
var
?ary = [1,23,4];
console.log(
typeof
?ary);?
//輸出結果是Object
上面的辦法并不能實時的檢測出是否是數組,只能判斷其類型,所以說typeof判斷基本類型數據還是挺好的,但是不能準確測試出是否是數組
2.instanceof 判斷
var?
ary = [1,23,4];
console.log(ary?
instanceof
?Array)
//true;
能準確的檢測出數據類型是否是數組,但是有缺點。如下解釋
3.原型鏈方法
這個辦法利用了原型鏈的方法,但是,這個是有兼容的哦,在IE早期版本里面__proto__是沒有定義的哦~而且,這個仍然有局限性。
?
我們現在就來總結一下第2種方法和第3種方法局限性。
instanceof 和constructor 判斷的變量,必須在當前頁面聲明的,比如,一個頁面(父頁面)有一個框架,框架中引用了一個頁面(子頁面),在子頁面中聲明了一個ary1,并將其賦值給父頁面的一個變量 ary2,
這時判斷該變量,Array == ary2.constructor;會返回false;
原因:
1、array屬于引用型數據,在傳遞過程中,僅僅是引用地址的傳遞。
2、每個頁面的Array原生對象所引用的地址是不一樣的,在子頁面聲明的array,所對應的構造函數,是子頁面的Array對象;父頁面來進行判斷,使用的Array并不等于子頁面的Array;切記,不然很難跟蹤問題!
4. 通用的方法
var
?ary = [1,23,4];
function
?isArray(o){
return
?Object.prototype.toString.call(o) ==?
'[object Array]'
;
}
console.log(isArray(ary));
function isType(type){
return function(o){
return Object.prototype.toString.call(o) === "[object " + type + "]";
}
}
var isArray = isType("Array");
var a = [1,2,34];
console.log(isArray(a))