在JS中,數組是屬於Object類型的,也就是屬於引用類型(引用類型存放在堆內存中,在棧內存會有一個或者多個地址來指向這個堆內存)。數組
因此對於引用類型,咱們不能typeof來判斷具體的類型,由於返回的都是‘object’。框架
接下來,我將介紹六種判斷方法,而且對這六種方法進行逐一解析函數
用法:arr instanceof Array
instanceof 主要是用來判斷某個實例是否屬於某個對象測試
function obj(){} let o1 = new obj(); console.log(o1 instanceof obj); // true
那麼咱們用instanceof 來判斷數組的方法以下:prototype
let arr = []; console.log(arr instanceof Array); // true
可是 instanceof 會有一個問題, 它的問題在於假定只有一個全局執行的環境。若是網頁中包含多個框架,那實際上就存在 兩個以上不一樣的全局執行環境, 從而存在兩個以上不一樣版本的Array構造函數。若是你從一個框架向另外一個框架傳入一個數組,那麼傳入的數組與在第二個框架中原生建立的數組分別具備不一樣的構造函數。
用法:arr.constructor === Array
Object的每一個實例都有構造函數 constructor,用於保存着用於建立當前對象的函數code
function obj(){} let o1 = new obj(); console.log(o1.constructor === obj); // true
如上所示,obj 的實例 o1 的 constructor 跟 obj 對象是相等的
那麼咱們就能夠用此來判斷數組了對象
let arr = []; console.log(arr.constructor === Array); // true
用法:Array.prototype.isPrototypeOf(arr)
Array.prototype 屬性表示 Array 構造函數的原型
其中有一個方法是 isPrototypeOf() 用於測試一個對象是否存在於另外一個對象的原型鏈上。繼承
let arr = []; console.log(Array.prototype.isPrototypeOf(arr)); // true
用法:Object.getPrototypeOf(arr) === Array.prototype
Object.getPrototypeOf() 方法返回指定對象的原型內存
因此只要跟Array的原型比較便可原型鏈
let arr = []; console.log(Object.getPrototypeOf(arr) === Array.prototype); // true
用法:Object.prototype.toString.call(arr) === '[object Array]'
雖然Array也繼承自Object,但js在Array.prototype上重寫了toString,而咱們經過toString.call(arr)其實是經過原型鏈調用了。
let arr = []; console.log(Object.prototype.toString.call(arr) === '[object Array]'); // true
用法:Array.isArray(arr)
ES5中新增了Array.isArray方法,IE8及如下不支持
Array.isArray ( arg )
isArray 函數須要一個參數 arg,若是參數是個對象而且 class 內部屬性是 "Array", 返回布爾值 true;不然它返回 false。採用以下步驟:
若是 Type(arg) 不是 Object, 返回 false。
若是 arg 的 [[Class]] 內部屬性值是 "Array", 則返回 true。
返回 false.
let arr = []; console.log(Array.isArray(arr)); // true