javascript 判斷變量是不是數組(Array)

過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的可是面試的時候,想不全,面試官不滿意...這個懊惱的行爲,今天的文章跟你們分享下:javascript如何判斷即是是數組。javascript

1. typeof真的那麼厲害嗎??html

//首先看代碼
var ary = [1,23,4];
console.log(typeof ary); //輸出結果是Object

上面的辦法並不能實時的檢測出是不是數組,只能判斷其類型,因此說typeof判斷基本類型數據仍是挺好的,可是不能準確測試出是不是數組(typeof的具體用法之後說起,如今迴歸正題)
2.instanceof 判斷前端

var ary = [1,23,4];
console.log(ary instanceof Array)//true;

從輸出的效果來看,仍是挺使人滿意的,能準確的檢測出數據類型是不是數組,不要高興的太早,你們先想一想這個的缺點,咱們接着說第三種方法
3.原型鏈方法java

var ary = [1,23,4];
console.log(ary.__proto__.constructor==Array);//true
console.log(ary.constructor==Array)//true 這兩段代碼是同樣的

這個辦法開起來好高大上哦~~,利用了原型鏈的方法,可是可是,這個是有兼容的哦,在IE早期版本里面__proto__
是沒有定義的哦~並且,這個仍然有侷限性,咱們如今就來總結一下第2種方法和第3種方法侷限性面試

總結一下第2種方法和第3種方法侷限性
instanceof 和constructor 判斷的變量,必須在當前頁面聲明的,好比,一個頁面(父頁面)有一個框架,框架中引用了一個頁面(子頁面),在子頁面中聲明瞭一個ary,並將其賦值給父頁面的一個變量,這時判斷該變量,Array == object.constructor;會返回false;
緣由:
一、array屬於引用型數據,在傳遞過程當中,僅僅是引用地址的傳遞。
二、每一個頁面的Array原生對象所引用的地址是不同的,在子頁面聲明的array,所對應的構造函數,是子頁面的Array對象;父頁面來進行判斷,使用的Array並不等於子頁面的Array;切記,否則很難跟蹤問題!數組

4.通用的方法瀏覽器

var ary = [1,23,4];
function isArray(o){
    return Object.prototype.toString.call(o)=='[object Array]';
}
console.log(isArray(ary));

具體Object.prototype.toString 的用法,請參照Object.prototype.toString的用法框架

今天總結這四種,算是三種吧,typeof是爲了引出後面的instanceof,固然總結這四種也是參考了網上的一些意見,若是不妥之處,請多指正~~但願和各位多多交流~函數

五、追加一種新的方法 Array.isArray(arg);
由於是新添加的,在不支持的瀏覽器上可能有兼容性,用的時候須要兼容下不支持的瀏覽器,這個時候就要結合第4中方法了測試

if(!Array.isArray){
    Array.isArray = function(arg){
        return Object.prototype.toString.call(arg)==='[object Array]'
    }

}

並且此方法能夠支持iframe判斷是不是數組,實際上是第四中的變形

再多的方法也須要擼碼來增強用法和經驗,前端們趕忙擼碼記憶吧....

相關文章
相關標籤/搜索