1. 程式人生 > >JS判斷陣列的六種方法詳解

JS判斷陣列的六種方法詳解

在JS中,陣列是屬於Object型別的,也就是屬於引用型別(引用型別存放在堆記憶體中,在棧記憶體會有一個或者多個地址來指向這個堆記憶體)。

所以對於引用型別,我們不能typeof來判斷具體的型別,因為返回的都是‘object’。

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

① 、instanceof 操作符判斷

用法:arr instanceof Array

instanceof 主要是用來判斷某個例項是否屬於某個物件

那麼我們用instanceof 來判斷陣列的方法如下

但是 instanceof 會有一個問題,它的問題在於假定只有一個全域性執行的環境。如果網頁中包含多個框架,那實際上就存在兩個以上不同的全域性執行環境

,從而存在兩個以上不同版本的Array建構函式。如果你從一個框架向另一個框架傳入一個數組,那麼傳入的陣列與在第二個框架中原生建立的陣列分別具有不同的建構函式。

②、物件建構函式的 constructor判斷

用法:arr.constructor === Array

Object的每個例項都有建構函式 constructor,用於儲存著用於建立當前物件的函式

如上圖所示,obj 的例項 o1 的 constructor 跟 obj 物件是相等的

那麼我們就可以用此來判斷陣列了

③、Array 原型鏈上的 isPrototypeOf

用法:Array.prototype.isPrototypeOf(arr)

Array.prototype  屬性表示 Array 建構函式的原型, 通過 console.log(Array.prototype) 我們可以看到Array原型鏈上的方法。

其中有一個方法是 isPrototypeOf()     用於測試一個物件是否存在於另一個物件的原型鏈上。

④、Object.getPrototypeOf 

用法:Object.getPrototypeOf(arr) === Array.prototype

Object.getPrototypeOf() 方法返回指定物件的原型

所以只要跟Array的原型比較即可

⑤、Object.prototype.toString

用法:Object.prototype.toString.call(arr) === '[object Array]'

雖然Array也繼承自Object,但js在Array.prototype上重寫了toString,而我們通過toString.call(arr)實際上是通過原型鏈呼叫了。

⑥、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.