JS判斷數組的六種方法詳解

在JS中,數組是屬於Object類型的,也就是屬於引用類型(引用類型存放在堆內存中,在棧內存會有一個或者多個地址來指向這個堆內存)。數組

因此對於引用類型,咱們不能typeof來判斷具體的類型,由於返回的都是‘object’。框架

接下來,我將介紹六種判斷方法,而且對這六種方法進行逐一解析函數

① instanceof 操做符判斷

用法: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構造函數。若是你從一個框架向另外一個框架傳入一個數組,那麼傳入的數組與在第二個框架中原生建立的數組分別具備不一樣的構造函數。

②對象構造函數的 constructor判斷

用法: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 原型鏈上的 isPrototypeOf

用法:Array.prototype.isPrototypeOf(arr)
Array.prototype  屬性表示 Array 構造函數的原型
其中有一個方法是 isPrototypeOf() 用於測試一個對象是否存在於另外一個對象的原型鏈上。繼承

let arr = [];
console.log(Array.prototype.isPrototypeOf(arr)); // true

④Object.getPrototypeOf

用法:Object.getPrototypeOf(arr) === Array.prototype
Object.getPrototypeOf() 方法返回指定對象的原型內存

因此只要跟Array的原型比較便可原型鏈

let arr = [];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true

⑤Object.prototype.toString

用法: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

用法: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
相關文章
相關標籤/搜索