2012-12-29 70 views
6

JSONJavaScript中的對象如何存儲在內存中?

一個目的官方文檔是一組無序名稱/值對。一個對象以{(左大括號)開始 ,並以}(右大括號)結束。每個名稱都是 ,後跟:(冒號),名稱/值對由 (逗號)分隔。

注意 我的Javascript新手,並在Javascript從名字JSON(JavaScript對象符號)本身,我假設的對象是一樣的JSON。如果我弄錯了,請糾正我的錯誤。

從上面的定義看來,Javascript對象最有可能是由散列圖或BST或一些類似的數據結構實現的。

但是當我在節點 shell中插入鍵值對時,它們以串行方式插入。這是我在節點殼試過現在

> var a = {} 
undefined 
> a['k1'] = 'a1' 
'a1' 
> a['k3'] = 'a3' 
'a3' 
> a['k2'] = 'a2' 
'a2' 
> a['k4'] = 'a4' 
'a4' 
> a['k5'] = 'a5' 
'a5' 
> a 
{ k1: 'a1', 
    k3: 'a3', 
    k2: 'a2', 
    k4: 'a4', 
    k5: 'a5' } 

,上打印a關鍵值對在相同的順序插入返回。所以我的問題是:

  • 我可以快速查找關鍵嗎?我的意思是O(log(n))或更好的複雜性。
  • 如果JSON不使用像BST,HashMap或類似的DS這樣的數據結構,那麼JSON對象究竟是如何置於內存之下的呢?

更新 好了,怎麼樣JavaScript對象。有人可以評論Javascript對象的底層實現。

+4

JSON是一種符號,就像XML是另一種符號。儘管它基於Javascript對象,因此它的名字很高。除此之外,沒有關係。 –

+0

沒有「JSON對象」。即使名稱應該告訴(「對象符號對象」?) – JJJ

+0

@FlorianMargaine感謝隊友爲您的評論。這很有幫助。 –

回答

6

你混淆JSON,這是只有一個基於文本的序列化格式可實現簡單的數據交換,和普通的JavaScript對象,這是性質的無序名單。

the MDN說:

一個目的是屬性的集合,和一個屬性是一個名稱和一個值之間的關聯 。屬性的值可以是一個函數,即 ,然後將其稱爲對象的方法。

對象屬性可以看作散列圖,因爲它們沒有排序。但是它往往更復雜一點:當對象是基於原型的時候,對象上沒有找到的屬性會向上搜索它所基於的原型。

使用javascript對象可以保證快速查找,因爲這是實現的重要組成部分。但是實現並不是由規範定義的,每個引擎都可以有自己的。

+0

感謝您的解釋。它確實澄清了很多誤解。 :) –

+0

是否有任何理由爲什麼我得到的JavaScript對象以序列化方式打印(與插入順序相同),不像Python的字典或C++ STL映射。 –

+0

我說它沒有正常化,但現在它是一個無證的(和無保證的)功能。看看這個討論:http://code.google.com/p/v8/issues/detail?id=164 –