如何檢測某個變量是否爲數組?javascript
《javascript 高級程序設計》原文摘錄:java
自從 ECMAScript 3 作出規定之後,就出現了肯定某個對象是否是數組的經典問題。對於一個網頁, 或者一個全局做用域而言,使用 instanceof 操做符就能獲得滿意的結果: if (value instanceof Array){ //對數組執行某些操做 } instanceof 操做符的問題在於,它假定只有一個全局執行環境。若是網頁中包含多個框架,那實 際上就存在兩個以上不一樣的全局執行環境,從而存在兩個以上不一樣版本的 Array 構造函數。若是你從 一個框架向另外一個框架傳入一個數組,那麼傳入的數組與在第二個框架中原生建立的數組分別具備各自 不一樣的構造函數。 爲了解決這個問題,ECMAScript 5 新增了 Array.isArray() 方法。這個方法的目的是最終肯定某 個值究竟是不是數組,而無論它是在哪一個全局執行環境中建立的。這個方法的用法以下。 if (Array.isArray(value)){ //對數組執行某些操做 } 支持 Array.isArray() 方法的瀏覽器有 IE9+、Firefox 4+、Safari 5+、Opera 10.5+和 Chrome。
那麼問題來了,如何在還沒有實現這個方法中的瀏覽器中準確檢測數組
因爲原生數組的構造函數名與全局做用域無關,所以用toString()方法,保證返回同樣的結果正則表達式
function isArray(value) { return Object.prototype.toString.call(value) === '[object Array]'; }
這樣的方法就能夠比較完美的解決判斷是否爲數組了,一樣也能夠判斷是否是函數數組
function isFunction(value) { return Object.prototype.toString.call(value) === '[object Function]'; }
是否是正則表達式瀏覽器
function isRegExp(value) { return Object.prototype.toString.call(value) === '[object RegExp]'; }
雖然這樣貌似是解決了問題,實際上這仍是會存在問題:Object.prototpye.toString()自己也可能會被修改框架