首先 Object 是 ES 定义的,ES 并没有规定你需要用什么底层数据结构,因此这个问题无解。 我假设你想问的是 V8 对于 Object 是怎么做的,对应什么数据结构,我们继续往下分析。Object 是阉割版的 哈希表,以下是解释。我们先看下哈希表的定义。哈希表散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。我的解释因此 Object 对应阉割版的哈希表, 更好一点哈希表应该是 Map,但是 Map 实际上有序的,因此更新 Java 的 SortedHashMap 。 Object 之所以说是阉割,指的是:其 key 只支持 字符串,如果不是字符串会被转化为字符串。其不纯粹, 不是一个正经的哈希表。因此他可能有一些问题。比如:const a = new Map() a.get('toString') // undefined const b = {} b.toString // f toString() { [native code]}由于原型链的影响,对象属性查找存在原型链的查找,因此可能会有性能损耗,而 Map 则不会。因此 Object 是一个不正经的哈希表。参考v8 src/base/hashmap.cc
首先 Object 是 ES 定义的,ES 并没有规定你需要用什么底层数据结构,因此这个问题无解。
我假设你想问的是 V8 对于 Object 是怎么做的,对应什么数据结构,我们继续往下分析。
Object 是阉割版的 哈希表,以下是解释。
我们先看下哈希表的定义。
哈希表
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
我的解释
因此 Object 对应阉割版的哈希表, 更好一点哈希表应该是 Map,但是 Map 实际上有序的,因此更新 Java 的 SortedHashMap 。 Object 之所以说是阉割,指的是:
因此他可能有一些问题。比如:
由于原型链的影响,对象属性查找存在原型链的查找,因此可能会有性能损耗,而 Map 则不会。
因此 Object 是一个不正经的哈希表。
参考