2013-05-25 56 views
0

我有一個規則排列:如何辨別真假的關聯和規則的陣列之間的差異

var My_Reg_Array = new Array('some string', 'some other string', 'and another'); 

與一個關聯數組:

var My_Associative_Reg_Array = { 

'some_key' :'Some string value', 
'some_key2' :'Some string value2', 
'some_key3' :'Some string value3' 

} 
  • 我怎樣測試它們JavaScript來查看哪一個是關聯的,哪一個是正常的?

  • 如果兩者都是對象......那麼是對象的「類型」......我們正在尋找的測試?

  • 這兩種對象類型有區別嗎?

謝謝你...有一個愉快的一天:)

+1

'o.constructor === Array'? – Blender

+0

'{} .toString.call(obj)=='[object Object] or [object Array] or [object Number] or [object RegExp] or [object Date] ...'' – elclanrs

+0

爲了說明,給出一個數組不是數字的「鍵」與賦予隨機對象任何屬性沒有什麼不同。所以如果你設置'array [anything] ='something'',它將不受任何數組方法的支配。 – Gary

回答

4

數組是JavaScript對象,所以你需要先檢查數組。

if(variable_to_check instanceof Array){ 
    console.log("I'm an array"); 
}else if(variable_to_check instanceof Object){ 
    console.log("I'm just an associative array, but really an Object"); 
} 
2

您正在尋找的實際區別是在數組和對象之間(您命名關聯數組)。但是一個數組只是一種對象,所以測試真的是它是否是一個數組。

最好的檢查是這樣的:

function isArray(x){ 
    return typeof x === 'object' && {}.toString.call(x) === '[object Array]'; 
} 

(其實,這是幾乎相同什麼jQuery不會)

那麼,爲什麼不只是檢查像x.constructor===Array構造?因爲它可能是由另一個框架創建的,在這種情況下構造函數將不會相同,儘管該對象是一個數組。

+0

我認爲還有其他地方的構造函數檢查可能會失敗,並且它有時也可以很好地處理框架。我不清楚那裏的細節,所以我玩得很安全。 – Dave

+0

是的,這是IMO的正確方法。 '{} .toString.call(obj)'是找出任何對象類型的最可靠的方法。 – elclanrs

+0

對象的'類型'是我們正在尋找的測試嗎? – KDawg

相關問題