2012-08-23 18 views
8

JavaScript'teki bir dizinin bir nesneden başka bir şey olmadığını biliyorum. Bunun gibi bir dizi tanımlarken : ["0", "1", "2"]:Dizi davranışı nasıl kopyalanır?

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

ve şu dizi elde

Object.keys(array); 

çalıştırın. array dizisinin uzunluğu 3'dur.

ben gibi bir mülk eklediğinizde:

array["a"] = "d"; 

Object.keys()["0", "1", "2", "a"] dönüyor fakat array dizi uzunluğunu hala 3 olduğunu. Böyle bir özellik eklerken

Ama:

array["3"] = "d"; 

array uzunluğu artık 4 olduğunu.

array yalnızca başka bir nesneyse, nesneyi var myArray = {} gibi sıfırdan başlattığımda bu tür bir davranışı nasıl başarabilirim?

+6

[Kangax'tan bu klasik blog gönderisini okuyun] (http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/) - size istediğini yapamazsın. – Pointy

+0

[Javascript dizi uzunluğu nesnelerin dizisi üzerinde yanlış] olası kopyası (http://stackoverflow.com/questions/2528680/javascript-array-length-incorrect-on-array-of-objects) – epascarello

cevap

1

Yalnızca .length özelliği, sayısal göstergelere, özellikle de sıfırdan büyük veya sıfıra eşit tamsayı değerleri olan özellikleri içerir.

o zaman yapabileceği bir dizi veya bir nesneden tüm anahtarlarının toplam sayısı nasıl soruyorsanız:

Object.keys(array).length 

... Object.keys() kendisi olacak bir dizi döndürür beri .length özelliği.

+0

P.S. '.length'in aslında' Object.keys (array) .length 'yerine _greater_ olabileceğini unutmayın, çünkü (Clyde tarafından belirtildiği gibi) uzunluk, en yüksek tamsayı dizininden daha büyüktür, ancak JS seyrek dizilere ve 'Object.keys'e izin verir.() 'sadece atanmış olan dizinleri döndürür. – nnnnnn

+0

Yani, nesneye yeni bir özellik eklendiğinde "length" değerinin hesaplandığını tahmin ediyorum? – Amberlamps

1

dizinin length mülkiyet yüksek sayısal endeksinin değeri +

1. Yani array["3"] = "d"; sonra en yüksek sayısal endeks 3 olduğunu dolayısıyla uzunluğu 4

Object.keys(array).length size uzunluğu vermelidir döndürür.

+0

'dizisi [1000000000] =" x "' bu şekilde çalışmıyor. Limit nerede? – Amberlamps

+0

'var dizi deneyin; array = ["a", "b", "c"]; dizisi [1000000000] = 1; dizisi.length; ' –

+0

Dizine bir başka 0 ekleyin ve tekrar deneyin. – Amberlamps

İlgili konular