10

关于JSON的官方文档

对象是一组无序的名称/值对。对象以 {(左大括号)开始,以 }(右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。

注意 我是 Javascript 新手,从名称 JSON(Javascript 对象表示法)本身来看,我假设 Javascript 中的对象与 JSON 相同。请纠正我,以防我弄错了。

从上面的定义看来,Javascript 对象很可能是由 hashmap 或 BST 或一些类似的数据结构实现的。

但是当我在Node 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

1 回答 1

8

你混淆了JSON,它只是一种基于文本的序列化格式,可以进行简单的数据交换,而普通的 javascript 对象是序列的属性列表。

正如MDN所说:

对象是属性的集合,属性是名称和值之间的关联。属性值可以是函数,然后称为对象的方法。

对象属性可以看作是哈希映射,因为它们没有排序。但它通常有点复杂:当对象是基于原型的时,在对象上找不到的属性会向上搜索它所基于的原型。

使用 javascript 对象,您可以获得保证的快速查找,因为这是实现的重要组成部分。但是实现不是由规范定义的,每个引擎都可以有自己的。

更新

从 2021 年几乎所有浏览器和 JS 服务器都有的 ES6 开始,object 中非整数键的顺序是插入顺序。

于 2012-12-29T13:18:31.110 回答