一个标准的JavaScript对象大概像其他每种语言的hashmap一样实现-密钥模数的哈希大小。这对于对象很有用,对Maps则不那么有用,因为键可以是易变的对象。
最初,我假设它将对密钥的地址进行哈希处理。大!但是,该地址也不是静态的。当数组或对象超出其容量时,它将重新分配到新的内存位置。
鉴于我的“逻辑”假设是错误的,那么Maps如何实现?必须对某事进行哈希处理才能提供O(1)查找。
NB :这与哈希图,字典或其他您想调用的名称不同。这特定于JavaScript中的Map
对象。
答案 0 :(得分:-1)
以下是ECMAScript-262标准(2018年6月版)所说的:
23.1映射对象
地图对象是键/值对的集合,其中键和值都可以是任意ECMAScript 语言值。一个唯一的键值只能出现在地图集合中的一个键/值对中。区别键 使用SameValueZero比较算法来区分值。
必须使用哈希表或平均提供访问时间的其他机制来实现Map对象 在集合中元素数量上是次线性的。此Map对象中使用的数据结构 规范仅用于描述Map对象所需的可观察语义。它并非旨在成为可行的实施模型。
以上语句中的最后一条语句指出Javascript标准本身与用于实现Map的机制无关。它只需要在地图上执行查找/更新操作即可在次线性(即通常为O(log(N)))时间内运行。