過完春節又有好多人尋找新的機會,旁邊的人面試完就會分享一些問題,明明會的可是面試的時候,想不全,面試官不滿意...這個懊惱的行爲,今天的文章跟你們分享下: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判斷是不是數組,實際上是第四中的變形
再多的方法也須要擼碼來增強用法和經驗,前端們趕忙擼碼記憶吧....