2017-06-13 94 views
2

在ES6中,地图和集合可以使用对象作为关键字。但是,由于ES6规范没有规定这些数据结构的底层实现,所以我想知道现代JS引擎如何存储密钥以保证O(1)或至少sublinear检索?ES6地图和集合:对象索引如何有效地索引?

在像Java这样的语言中,程序员可以明确地提供一个(好的)hashCode方法,它将密钥均匀地散列在密钥空间中以保证性能。然而,由于JS没有这样的特性,仍然认为他们在Maps和Sets实现中使用某种哈希算法仍然公平。

任何信息将不胜感激!

+0

是的,当然他们使用哈希。而且因为你不能指定你自己的平等,你也不需要实现你自己的散列函数。他们只是用于对象身份。 – Bergi

+1

[es6地图和设置复杂性,v8实现](https://stackoverflow.com/q/33611509/1048572)可能的重复?如果回答你的问题,我会关闭。 – Bergi

+0

啊我看到了,所以我明白他们使用对象标识来检查是否相等。但他们如何获得哈希位置?某种memoryAddress%keySpace? – luanped

回答

3

是的,该实现基于散列,并具有(分期付款)不断的访问时间。

“他们使用对象身份”是一种简化;完整的故事是ES Maps和Sets使用SameValueZero算法确定相等性。根据这个规范,V8的实现为字符串和数字计算“真实”哈希值,并为对象选择一个随机数作为“哈希”,它将这些数据作为私有(隐藏)属性存储在这些对象上以供以后访问。 (这不太理想,将来可能会改变,但现在就是这样)

使用memoryAddress % keySpace无法工作,因为垃圾回收器会移动对象,并且每当任何对象可能移动时重新刷新所有地图和集将过于复杂和昂贵。