Javascript 引用散列

Javascript reference hashing

本文关键字:引用 Javascript      更新时间:2023-09-26

我有一个对象:

var myObject  = {myKey: myVal};

我想将一些元数据归因于此对象,而无需直接编辑该对象。例如,假设我想向该对象添加一个标签"myTag"。我可以通过创建一个将标签与对象列表匹配的新对象来做到这一点的一种方法:

var tags = {
    'myTag': [myObject, someOtherObject, ...],
    'myTag2': [otherObject, myObject, ...]
}

问题是,如果我遇到对该对象的另一个引用并想知道其现有标签是什么,我必须遍历整个标签列表,看看每个数组中是否有对该对象的引用。随着标签和对象引用列表的增长,这将变得非常昂贵。

我一直在寻找某种"哈希"对象引用的方法,这样我就可以翻转它的标签列表,如下所示:

var tags = {
    myObject: ['myTag', 'myTag2']
}

但是由于对象引用不能用作键,因此我找不到任何干净的方法来考虑性能来实现此目的。关于如何处理这个问题的任何想法?

在 ES6 中,您可以使用允许对象成为键的weakMap。 因此,您可以直接将对象存储在mapweakMapset中,而无需修改对象。

在 ES5 中,对象不能是键,因此您必须向对象添加一个属性,该属性可用作对象的句柄。 如果不编辑对象,则无法执行此操作。 附加的属性可以设置为只读且不可枚举(因此大多数代码看不到它(。这是对 ES5 中对象的影响最小。

这种添加已知属性的技术,该

属性分配了某种唯一值以跟踪给定对象,这正是我们在 ES6 中使用 weakMap 之前人们为解决此问题所做的。

此 Set polyfill(旨在尽可能接近地模拟 ES6 实现,但在 ES5 中工作(允许您将对象添加到 Set 并使用所描述的解决方法。 如果检查该代码中的 getKey() 函数,则可以看到一种技术,该技术在对象上使用已知属性名称,然后根据对象的类型使用计数器和前缀来为该特定对象创建唯一标识符。 然后,该键以不可枚举、不可配置、不可写的方式附加到对象,使其成为对象的唯一标识符,通常只有知道要查找的内容的人才能看到。

从那时起,任何查看该对象的人都可以检查附加到它的标识符,并将其与以前的某个标识符进行比较,以查看这是否确实是同一对象。 当然,标识符本身可以存储在某个查找表中,而不会创建对此对象的任何不需要的引用(因为标识符只是一个字符串(。