1. 程式人生 > >js判斷一個物件為陣列的方法

js判斷一個物件為陣列的方法

陣列物件

js的陣列是無型別的:陣列元素可以是任意型別,並且同一個陣列中的不同元素也可能有不同的型別。陣列的元素可以是物件或其他陣列,這樣就可以建立複雜的資料結構。
通常我們可以用一元運算子typeof來判斷js的資料型別,但是對於陣列這樣一個特殊的物件卻只能返回"object"
typeof [1,2,3]
"object"
typeof 100
"number"
typeof false
"boolean"
typeof undefined
"undefined"
typeof NaN
"number"
typeof function(){}
"function"
typeof null
"object"

判斷陣列的方法

  • instanceof
    instanceof 是一個二元運算子,左邊運算元是一個物件,不是的話返回false,右邊運算元是一個函式物件或者函式構造器,不是的話返回false。原理是通過判斷左運算元的物件的原型鏈上是否具有右運算元的建構函式的prototype屬性。
[1,2] instanceof Array 
true
  • Array.isArray(arr)
    這個ES5新增的一個Array方法,該方法是Array物件的一個靜態函式,用來判斷一個物件是不是陣列。
Array.isArray([1,2])
true
如果頁面裡面有n個frame,就存在多個window,每個window都有自己的Array物件,比如確定子window裡的某個陣列是不是Array時,用instanceof這個方法就不行了
var fr=window.frames[0];
fr.onload=function(){
   console.log(fr.arr instanceof Array);//false
   console.log(Array.isArray(fr.arr));//true
   //arr是另外一個頁面的一個數組
}
  • Object.prototype.toString.call(arr) === “[object Array]”
Object.prototype.toString.call([1,2])
"[object Array]"
  • arr.constructor.name===’Array’
[1,2].constructor.name==='Array';
true
但是物件的constructor屬性可以被改寫,改寫後用改方法判斷就不行了

var arr=[1,2];
arr.constructor={};
arr.constructor.name === "Array"  //undefined
false
  • 其他方法 可以通過陣列的一些獨有的方法判斷該物件是不是陣列,比如join,push等
var c=[1,2];
c.push('3');//3
console.log(c)
[1, 2, "3"]

var c="12";
c.push('3');
//Uncaught TypeError: c.push is not a function(…)


var c=[1,2];
c.join('');
"12"

var c='12';
c.join('');
//Uncaught TypeError: c.join is not a function(…)

總結

通過上面的幾種判斷物件為陣列物件的方法分析,使用Array.isArray(arr)和Oblect.prototype.toString.call(arr)是比較好的方法。