2011-07-09 7 views
5

Bu, bir Array nesnesinde .push() numaralı telefonu çağırırken ve JavaScript, temelde "dizi" nin kapasitesini (öğe sayısı) artırır. Ayrıca, JS için bu tür bir bilgi bulmak için iyi bir kaynak varsa, bu dahil etmek yararlı olacaktır.Modern tarayıcılar, özellikle öğeler ekleyerek JS Array'i nasıl uygular?

düzenlemek

O JS Dizisi özel özellikleri olan değişmez bir nesne gibi görünüyor. Bununla birlikte, daha düşük bir ayrıntı seviyesiyle ilgileniyorum - tarayıcıların bunu kendi JS motorlarında nasıl uyguladıkları.

+0

Kapasiteyle ne demek istiyorsunuz? bayt cinsinden boyut? – Ibu

+1

Uygulamaya bağlı olduğunu hayal ediyorum. Belli bir şekilde yapılmasının gerekli olduğunu sanmıyorum ... – jswolf19

+0

@ jswolf19 w3c veya Ecma'yı hiç kimsenin bir uygulamayı belirtmediğini farz ettim, ama kesinlikle uygulama var. webkit için. – Jeff

cevap

4

herhangi olamaz: Onlar aslında sadece vb length özelliğiyle karmaları ve "0" özelliklerini, "1", "2", bir dizi .push() yaptığınızda, etkin yapar nesne ediyoruz Bu qurstion'a tek doğru cevap. Bir dizinin genişletme mekanizması bir iç uygulama detayıdır ve bir JS uygulamasından diğerine değişiklik gösterebilir. Aslında, Tamarin motoru, dizinin sıralı mı yoksa seyrek mi olacağını belirleyen dizilere göre dahili olarak kullanılan iki farklı uygulamaya sahiptir.

+0

+1, Daha fazla bilgi verirseniz, JS hakkında sık sık yeni bir şey öğrenemedim :) Görünüşe göre, hem Chrome hem de FF, benzer uygulamalar (hem vektör, hem karma, hem de benzer) kullanırlar. ölçütler: http://jsperf.com/array-popuplation-direction –

+0

@Samuel Neff Bu gerçekten ilginç. Farklı tarayıcıların (ilgili JS motorları) bu seviyede nasıl çalıştığını nasıl anlıyorsunuz? – Jeff

+0

Bu konuyla ilgili ilginç bir yazı: http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics –

0

JavaScript gibi dizinin uzunluğunu ilan etme mekanizması içerir yapar:

var foo = new Array(3); 
alert(foo.length); // alerts 3 

Ama diziler javascript dinamik bunu yapmak için hiçbir neden yoktur, çünkü manuel diziler tahsis etmek gerekmez . Yukarıdaki örnek, sabit uzunluklu bir dizi oluşturmaz, sadece 3 tanımsız elemanla başlatır.

// Düzenle: Ya sorunuzu yanlış anladım ya da siz değiştirdiniz, üzgünüm, sorduğun şeyin bu olduğunu düşünmüyorum.

+0

Faydalı bilgiler, ancak bunu yapmak için bir neden olmadığını söylemek doğru değil. Bir diziyi bilinen bir gelecek uzunluğa getirmenin daha sonra daha verimli hale getirilmesini sağlayabilirsiniz. Tamamen tarayıcının uygulamasına bağlıdır, ancak uygulamaya bağlı olarak büyük bir performans artışı olabilir. –

1

Bu yanıt yanlış. Gerçek diziler olmadıklarından JavaScript

http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics

http://jsperf.com/array-popuplation-direction

Diziler kapasiteye sahip değildir: @Samuel eff yanıtını ve aşağıdaki kaynaklara bakınız.

ary[ ary.length++ ] = the_new_element; // set via hash 

+1

'++' 'ary.length'de bırakabilirsiniz. – Reid

+0

@Reid - hayır, yapamazsınız. ++, array.length değerini arttırmaktır, değeri ayarlarken kullanılmamasını (ben motorun içinde olup bitene değinerek, gerçek JS koduna değil) –

+0

@cwolves, Javascript'teki bir Array nesnesinin açıklamasının yanlış olmadığını tüm bunlar, dediğiniz gibi basit nesnelerdir, bazı özel karakteristiklere sahiptirler - uzunluklarının özelliklerine göre - Array.prototype'dan miras kalanlar ve [[Sınıf]] 'dır, '' Array '' Örneğin '({}) ToString.call ([].); // "[object Array]" ', ancak evet, bellek yönetiminin iç yapısı tamamen * uygulamaya bağlı *. – CMS

İlgili konular