2012-04-21 35 views
10

我想知道如何在JavaScript引擎(V8,Spidermonkey等)引擎下實現對象。他們真的只是哈希表嗎?如果是這樣,他們如何處理碰撞?在引擎蓋下,是Javascript對象散列表嗎?

+1

查看此答案http://stackoverflow.com/a/6602088/8338 – 2012-04-21 07:53:29

+0

可能的重複[JavaScript虛擬機如何實現對象屬性訪問?它是散列表?](http://stackoverflow.com/questions/6586670/how-does-javascript-vm-implements-object-property-access-is-it-hashtable) – Newtang 2012-04-21 21:37:35

回答

5

首先,對於不同的JS引擎,答案可能有所不同。另外,我假設你正在具體詢問物業存儲;顯然對象也有一堆其他狀態(原型鏈鏈接是顯而易見的)。

在Spidermonkey的情況下,對象基本上有一個鏈接列表(propname,infromation關於屬性)對,直到他們有太多的屬性,當我認爲他們仍然保持鏈接列表(因爲順序對於JS在實踐中),但添加一個帶外散列表,將屬性名稱映射到鏈接列表中的條目。

可能還有其他原因切換到散列表;細節尚未完全確定,未來可能會發生變化。

鏈接列表和哈希表實際上是跨對象共享的;只要兩個對象具有相同的屬性名稱和相關屬性信息(對於具有存儲值的屬性不包括該值)並且屬性按照相同順序設置,則它們能夠共享屬性鏈接列表。

當需要存儲這些屬性值時,實際屬性值將存儲在對象的一個​​數組中(更確切地說,是兩個數組;一個與對象內聯分配,其大小固定在對象創建時間,一個動態分配並根據需要調整大小,以便稍後添加的屬性)。

-1

是的,他們是散列表。我不明白你的碰撞部分,請解釋你的問題的第二部分

+3

哈希函數可以返回相同的密鑰不同的輸入,即所謂的碰撞。 – stewe 2012-04-21 20:40:45

+4

JS對象是_conceptually_哈希表。實際的實現不一定是散列表,並且通常不是。 – 2012-04-22 02:08:14

+1

對於v8和spidermonkey他們是 – kishu27 2012-04-22 15:00:16