在前端面試中,我們經常會被問道,如何判斷一個對象是不是數組類型,下面就這一點展開詳細的描述,並總結一下共有幾種方法。
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