天天看點

如何判斷一個對象是數組

1,constructor方法 

if(my_value&& typeof my_value==="object" && my_value.constructor === Array){

   //my_valule是一個數組 

    }      
function isArray(object){
    return object && typeof object==='object' &&
            Array === object.constructor;
}      
var a=[];
console.log(a instanceof Array) //傳回true      

上面的檢測如果是iframe裡面,在同幀或者寬口建立的數組将會給出false。

使用instaceof和construcor,被判斷的array必須是在目前頁面聲明的!比如,一個頁面(父頁面)有一個架構,架構中引用了一個頁面(子頁面),在子頁面中聲明了一個array,并将其指派給父頁面的一個變量,這時判斷該變量,Array == object.constructor;會傳回false;

原因:

1、array屬于引用型資料,在傳遞過程中,僅僅是引用位址的傳遞。

2、每個頁面的Array原生對象所引用的位址是不一樣的,在子頁面聲明的array,所對應的構造函數,是子頁面的Array對象;父頁面來進行判斷,使用的Array并不等于子頁面的Array;切記,不然很難跟蹤問題!

在js語言精粹中的方法,如下圖,可以忽略上面的問題

if(my_value&&typeof my_value==="object"&&typeof  my_value.length ==='number'&& !(my_value.propertyIsEnumerable('length')){

}      

  有length和splice并不一定是數組,因為可以為對象添加屬性,而不能枚舉length屬性,才是最重要的判斷因子。

function isArray(object){

  return object && typeof object==='object' &&

  typeof object.length==='number' &&

  typeof object.splice==='function' &&

  //判斷length屬性是否是可枚舉的 對于數組 将得到false

function isArray(o) {
    return Object.prototype.toString.call(o) === ‘[object Array]‘;
}      
有沒有好的方法,快速的将object轉成array?