【问题标题】:How do Maps hash object references in JavaScript?Maps 如何在 JavaScript 中散列对象引用?
【发布时间】: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


【解决方案1】:

ECMAScript-262 标准(2018 年 6 月版)的内容如下:

23.1 地图对象

Map 对象是键/值对的集合,其中键和值都可以是任意的 ECMAScript 语言价值观。不同的键值可能只出现在 Map 集合中的一个键/值对中。不同的键 使用 SameValueZero 比较算法区分值。

必须使用哈希表或其他平均提供访问时间的机制来实现映射对象 与集合中的元素数量呈次线性关系。此 Map 对象中使用的数据结构 规范仅旨在描述 Map 对象所需的可观察语义。它不是一个可行的实现模型。

上述声明中的最后一条声明指出,Javascript 标准本身对用于实现 Map 的机制是不可知的。它只要求 Map 上的查找/更新操作在亚线性(即通常为 O(log(N)) )时间内运行。

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 2014-02-16
    • 2011-07-30
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多