2011-07-09 62 views
5

我的意思是,當在一個Array對象上調用.push()時,JavaScript會增加底層「數組」的容量(以元素爲單位)。另外,如果有一個很好的資源來尋找JS的這種信息,這將有助於包括。現代瀏覽器如何實現JS Array,特別是添加元素?

編輯

看來,JS數組類似於對象字面具有特殊性能。但是,我對低層次的細節感興趣 - 瀏覽器如何在各自的JS引擎中實現這一點。

+0

你是什麼意思的能力?字節大小? – Ibu

+1

我想它取決於實施。我認爲它沒有被指定必須以某種方式完成...... – jswolf19

+0

@ jswolf19我認爲沒有人喜歡w3c或Ecma指定了一個實現,但肯定有實現,例如,爲webkit。 – Jeff

回答

4

不能有任何這個問題的唯一正確答案。一個數組的擴展機制是一個內部的實現細節,可以從一個JS實現到另一個JS實現。事實上,Tamarin引擎有兩種不同的實現方式,這些實現方式在內部用於數組,取決於它是否確定數組是否是順序的或稀疏的。

+0

+1,如果可以的話,我會給你更多的東西,我不會經常學習關於JS的任何新東西:)顯然,Chrome&FF使用類似的實現(包括向量&哈希,或類似的)從基準:http://jsperf.com/array-popuplation-direction –

+0

@Samuel Neff這真的很有趣。你如何看出不同瀏覽器(他們各自的JS引擎)在這個級別上的工作情況? – Jeff

+0

關於這個問題的一篇有趣的文章:http://news.qooxdoo.org/javascript-array-performance-oddities-characteristics –

0

JavaScript並提供某種機制來聲明數組的長度等:

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

但因爲數組是在JavaScript動態的,沒有理由這樣做,您不必手動分配您的陣列。上面的例子沒有創建一個固定長度的數組,只是用3個未定義的元素初始化它。

//編輯:我要麼誤讀你的問題,要麼改變了它,對不起,我不認爲這就是你要求的。

+0

有用的信息,但說沒有理由這樣做是不正確的。將數組初始化爲已知的未來長度很有可能會使其後添加效率更高。它完全取決於單個瀏覽器的實現,但取決於實現可能會有很大的性能提升。 –

1

這個答案是錯誤的。請參閱@Samuel內夫的答案,以下資源:

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

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

陣列中的JavaScript沒有能力,因爲它們不是真正的數組。他們實際上只是對象與length財產散列和"0"性質,"1""2",等當你的陣列上做.push(),它有效的作用:

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

+1

您可以在'ary.length'上放棄'++'。 – Reid

+0

@Reid - 不,你不能。 ++是增加array.length,而不是在設置值時使用(我指的是引擎內部發生的事情,而不是實際的JS代碼) –

+0

@cwolves,你在Javascript中描述的Array對象沒有錯根據你所說,它們是簡單的對象,具有一些特殊的特徵,比如它們的'length'屬性,它們繼承自'Array.prototype',它們的[[Class]]內部屬性是''Array'',例如'({})toString.call([])。 //「[object Array]」,但是,內存管理的內部完全依賴於實現。 – CMS

相關問題