2012-08-23 34 views
8

我知道JavaScript中的數組只不過是一個對象。 當我這樣定義一個數組:如何複製數組行爲?

var array; 
array = [ "a", "b", "c" ]; 

和運行

Object.keys(array); 

我獲得以下數組:["0", "1", "2"]。數組長度爲array3

當添加一個屬性,如:

array["a"] = "d"; 

Object.keys()正在返回["0", "1", "2", "a"],但array陣列長度仍然3

但是當我添加這樣一個屬性:

array["3"] = "d"; 

array長度是現在4

如果array只是另一個對象,當我像var myArray = {}一樣從頭開始創建對象時,如何實現這種行爲?

+6

[閱讀這篇來自Kangax的經典博客文章](http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/) - 事實證明,你不能做你在問什麼。 – Pointy

+0

[Javascript數組長度在對象數組上不正確]的可能重複(http://stackoverflow.com/questions/2528680/javascript-array-length-incorrect-on-array-of-objects) – epascarello

回答

1

.length屬性只包含具有數字索引的屬性,特別是具有大於或等於零的整數值的屬性。

如果你問如何獲得從數組或對象的所有鍵的總計數,那麼你可以這樣做:

Object.keys(array).length 

...因爲Object.keys()返回將本身有一個數組一個.length財產。

+0

P.S.請注意,'.length'實際上可能比'Object.keys(array).length'大_greater_,因爲(如Clyde所指出的)長度比最高整數索引大1,但JS允許稀疏數組和Object.keys ()'只返回實際分配的索引。 – nnnnnn

+0

所以我猜測每次向對象添加新屬性時都會計算'length'的值? – Amberlamps

1

陣列的length屬性是最高的數值指標的值+ 1

所以array["3"] = "d";後的最高數字索引是3因此長度返回4

Object.keys(array).length應該給你的長度。

+0

'array [1000000000] =「x」'不會這樣操作。限制在哪裏? – Amberlamps

+0

試試'var array; array = [「a」,「b」,「c」]; array [1000000000] = 1;數組。長度;' –

+0

將另一個'0'添加到索引並請再試一次。 – Amberlamps