1. 程式人生 > >面試題-如何判斷一個物件是不是陣列型別

面試題-如何判斷一個物件是不是陣列型別

在前端面試中,我們經常會被問道,如何判斷一個物件是不是陣列型別,下面就這一點展開詳細的描述,並總結一下共有幾種方法。

1.我們首先回顧一下typeof操作符的用法

操作符可以用來檢測給定變數的資料型別,返回的值有以下幾種:undefined,boolean,string,number,object,function

2.使用typeof來判斷

我們驚喜的發現:除了方法會返回function值之外,[]和{}都是返回的object值,所以無法通過typeof來區分物件還是陣列,這種方法不可用。

3.根據建構函式來判斷

instanceof操作符可以來表示例項是否屬於某個建構函式建立的。

從上圖來看,obj1是建構函式Array的例項沒問題,obj4也是建構函式的例項型別,顯然obj4應該是物件資料型別,為什麼會產生這種情況,obj4.__proto__=obj1,obj4改變了它的原型指向,草圖如下:

 

 

因為改變了obj4的原型指向導致使用instanceof字元判斷出obj4也為陣列型別了,所以此方法也不可取。

3.使用原型物件判斷

發現結果和使用instanceof字元一樣,所以還是無法區[]是陣列型別

4.根據物件的class屬性來判斷

class:每個物件的內部屬性,記錄建立物件時使用的型別名,一旦建立,無法修改。

問題:陣列型別等內建型別,重寫了toString方法,直接呼叫陣列物件的方法,不在返回class

解決:使用call替換this為指定物件呼叫Object原型上的toString方法即可。

5.Array.isArray直接判斷

Array.isArray() 用於確定傳遞的值是否是一個 Array。如果物件是 Array,則為true; 否則為false.

綜上所述,判斷一個物件是不是陣列型別最可靠的方法是這兩種: Object. prototype. toString. call(obj)===[ object Array]和Array. isArray(obj)。


參考資料:

《JavaScript高階程式設計》  MDN