【发布时间】:2018-12-31 09:27:40
【问题描述】:
一个标准的 JavaScript 对象可能在其他所有语言中都像 hashmap 一样实现——键模数的哈希值和大小。这对对象很有效,但对 Maps 则不然,因为键可以是可变对象。
最初,我假设它会散列密钥的地址。伟大的!但是,地址也不是静态的。当数组或对象超出其容量时,它会重新分配到新的内存位置。
鉴于我的“逻辑”假设是错误的,地图是如何实现的? 某些东西必须经过哈希处理才能提供 O(1) 查找。
NB:这不与哈希图、字典或任何您想称呼它的东西相同。这是特定于 JavaScript 中的 Map 对象。
【问题讨论】:
-
在其他人不可避免地问之前,是的,我已经搜索过了。我在 Stack Overflow 或其他网站上都找不到任何东西。
-
@chevybow 不一样。
Map是一种特定类型的对象,与 JS 中的标准对象不相同。 -
请注意“移动内存”,例如在垃圾收集之后,无论如何都需要更新引用 - 想象在变量中有一个数组,并且物理数据改变了位置。我不知道实现如何处理这个问题(你没有提到你关心的实现),但他们可能会散列一些元数据以供参考(比如一些 ID),或者在移动内存时更新所有内容(不太可能,因为昂贵)。
-
您必须查看 V8 或 SpiderMonkeys 的源代码。
标签: javascript dictionary ecmascript-6 dynamic-memory-allocation